2016-07-09 4 views
14

Я использую библиотеку ThreeTen-Backport для своего Android-проекта (потому что java.time еще не реализован в разработке Android).Ошибка в ThreeTen-Backport для Android - ZoneRulesException: не зарегистрированы файлы данных часовых поясов

Когда я пишу LocalDate today=LocalDate.now(); или LocalTime time=LocalTime.now(); я получаю следующее исключение:

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) 

Та же строка кода хорошо работает в другом проекте Java у меня есть, который использует родную библиотеку java.time.

Я искал возможное решение, но не смог найти что-либо полезное: было предложено одно решение: мне нужно использовать другую банку, которая включает в себя правила часовых поясов, и другие предположили, что в пути к классам могут быть две или более библиотеки ThreeTenBP ,
Эти случаи не соответствуют моему делу.

Внутри файла build.gradle, в разделе зависимостей, которые я пробовал несколько конфигураций:

  • Сначала я использовал - compile 'com.jakewharton.threetenabp:threetenabp:1.0.3'
  • Затем я попробовал - compile 'org.threeten:threetenbp:1.0.3'
  • После этого, Я попробовал - compile 'org.threeten:threetenbp:1.3.1'
  • В настоящее время я использую compile 'org.threeten:threetenbp:1.3.2'

Я не знаю, что не так с этой строкой кода и как ее исправить.
Методы LocalDate.now() и LocalTime.now() должны работать без указания часового пояса.

ответ

24

Для проекта Android вы должны использовать

compile 'com.jakewharton.threetenabp:threetenabp:1.0.3 

Убедитесь, что вы называете AndroidThreeTen.init(this); перед использованием классов из библиотеки. Это будет считывать данные часовых поясов (включены в библиотеку). Вы можете инициализировать библиотеку в своем классе Application в методе onCreate, как это рекомендуется в README.

+2

Спасибо, у моего проекта раньше не было класса приложения, поэтому я не смог использовать код 'AndroidThreeTen.init (this);'. Я думал добавить это в метод 'onCreate', но я видел, что это неправильно. Теперь я создал новый класс, который расширяет класс приложения и помещает эту строку в метод 'onCreate'. Теперь все работает просто отлично! –

+1

Вызов init в onCreate нарушает строгий режим и может даже задержать запуск приложения. Если вы вызываете init асинхронно, вы должны не использовать его до тех пор, пока он не завершится, что может быть сложно для тестирования JUnit. –

+4

@ErikB нарушает строгий режим, потому что он считывает файл часовых поясов из активов, поэтому он задерживает время запуска. Для модульных тестов вы должны использовать оригинальную библиотеку http://www.threeten.org/threetenbp/, потому что у этого есть зависимости от Android, как описано здесь https://github.com/JakeWharton/ThreeTenABP/issues/14 – LordRaydenMK