2016-07-09 69 views
14

我爲我的Android項目使用ThreeTen-Backport庫(因爲java.time還未在android開發中實現)。Android上的ThreeTen-Backport錯誤 - 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庫。

我搜索了一個可能的解決方案,但找不到任何有用的東西:一個解決方案建議我需要使用另一個包含時區規則的jar,其他jar提示在classpath中可能有兩個或多個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);。這將讀取時區數據(包含在庫中)。您可以在onCreate方法中對Application類中的庫進行初始化,就像在README中推薦的那樣。

+2

謝謝,我的項目之前沒有應用程序類,所以我無法使用'AndroidThreeTen.init(this)''代碼。我想在活動的'onCreate'方法中加入這個,但是我看到它不正確。 現在我創建了一個新的類,它擴展了應用程序類並將該行放入'onCreate'方法中。現在一切正常! –

+1

在onCreate中調用init違反了strictmode,甚至可能會延遲應用程序啓動。如果您異步調用init,則必須確保在完成之前不要使用它,這對於JUnit測試來說很難。 –

+4

@ErikB它確實違反了嚴格模式,因爲它從資產中讀取時區文件,因此延遲了啓動時間。對於單元測試,你應該使用原始庫http://www.threeten.org/threetenbp/,因爲這裏有Android依賴關係,如https://github.com/JakeWharton/ThreeTenABP/issues/14 – LordRaydenMK