2016-07-09 6 views
14

Ich verwende die ThreeTen-Backport-Bibliothek für mein Android-Projekt (da java.time in der Android-Entwicklung noch nicht implementiert ist).ThreeTen-Backport-Fehler bei Android - ZoneRulesException: Keine Zeitzonendatendateien registriert

Wenn ich schreibe LocalDate today=LocalDate.now(); oder LocalTime time=LocalTime.now(); erhalte ich die folgende Ausnahme:

Caused by: org.threeten.bp.zone.ZoneRulesException: 
    No time-zone data files registered 
     at org.threeten.bp.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:176) 
     at org.threeten.bp.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:133) 
     at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143) 
     at org.threeten.bp.ZoneId.of(ZoneId.java:357) 
     at org.threeten.bp.ZoneId.of(ZoneId.java:285) 
     at org.threeten.bp.ZoneId.systemDefault(ZoneId.java:244) 
     at org.threeten.bp.Clock.systemDefaultZone(Clock.java:137) 
     at org.threeten.bp.LocalDate.now(LocalDate.java:165) 

Das gleiche Codezeile funktioniert gut in einem anderen Java-Projekt, das ich habe, die die native java.time Bibliothek verwendet.

Ich suchte nach einer möglichen Lösung, konnte aber nichts Nützliches finden: eine Lösung schlug vor, dass ich ein anderes Jar verwenden muss, das die Zeitzonenregeln enthält, und andere schlug vor, dass es zwei oder mehr ThreeTenBP-Bibliotheken im Klassenpfad geben könnte .
Diese Fälle stimmen nicht mit meinem Fall überein.

Innerhalb der build.gradle Datei im Abschnitt Abhängigkeiten, ich habe versucht, einige Konfigurationen:

  • Zuerst habe ich - compile 'com.jakewharton.threetenabp:threetenabp:1.0.3'
  • Dann habe ich versucht - compile 'org.threeten:threetenbp:1.0.3'
  • Danach, ich versuchte - compile 'org.threeten:threetenbp:1.3.1'
  • Derzeit verwende ich compile 'org.threeten:threetenbp:1.3.2'

Ich weiß nicht, was mit dieser Codezeile falsch ist und wie sie zu beheben ist.
Die Methoden LocalDate.now() und LocalTime.now() sollten ohne Angabe einer Zeitzone funktionieren.

Antwort

24

Für Android-Projekt sollten Sie

compile 'com.jakewharton.threetenabp:threetenabp:1.0.3 

Stellen Sie sicher, AndroidThreeTen.init(this); rufen verwenden, bevor die Klassen aus der Bibliothek. Dies liest die Zeitzonendaten (in der Bibliothek enthalten). Sie können die Bibliothek in Ihrer Application Klasse in der onCreate Methode so initialisieren, wie es in der README empfohlen wird.

+2

Vielen Dank, mein Projekt hatte noch keine Anwendung, daher konnte ich den 'AndroidThreeTen.init (this);' Code nicht verwenden. Ich dachte darüber nach, dies in der 'onCreate'-Methode der Aktivität hinzuzufügen, aber ich sah, dass es nicht richtig war. Jetzt habe ich eine neue Klasse erstellt, die die Anwendungsklasse erweitert und diese Zeile in die onCreate-Methode einfügt. Jetzt funktioniert alles super! –

+1

Das Aufrufen von init in onCreate verletzt strictmode und kann sogar den Start der Anwendung verzögern. Wenn Sie init asynchron aufrufen, müssen Sie sicherstellen, dass Sie es nicht bis zum Abschluss verwenden, was für JUnit-Tests schwierig sein kann. –

+4

@ErikB verletzt es den strikten Modus, weil es die Zeitzonen-Datei von Assets liest, so dass es die Startzeit verzögert. Für Komponententests sollten Sie die Originalbibliothek http://www.threeten.org/threetenbp/ verwenden, da diese Android-Abhängigkeiten hat, wie hier erklärt https://github.com/JakeWharton/ThreeTenABP/issues/14 – LordRaydenMK

Verwandte Themen