2016-07-09 35 views
14

Tôi đang sử dụng thư viện ThreeTen-Backport cho dự án Android của mình (vì java.time chưa được triển khai trong phát triển Android).Lỗi ThreeTen-Backport trên Android - ZoneRulesException: Không có tệp dữ liệu múi giờ nào được đăng ký

Khi tôi viết LocalDate today=LocalDate.now(); hoặc LocalTime time=LocalTime.now(); tôi nhận được ngoại lệ sau đây:

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) 

Dòng cùng một đoạn mã hoạt động tốt trong một dự án java tôi có, trong đó sử dụng thư viện java.time bản địa.

Tôi đã tìm kiếm một giải pháp khả thi nhưng không thể tìm thấy gì hữu ích: một giải pháp đề nghị tôi cần sử dụng một bình khác bao gồm các quy tắc múi giờ và các gợi ý khác có thể có từ hai thư viện ThreeTenBP trở lên bên trong classpath .
Những trường hợp đó không khớp với trường hợp của tôi.

Bên trong tập tin build.gradle, ở phần phụ thuộc, tôi đã thử vài cấu hình:

  • Lúc đầu, tôi đã sử dụng - compile 'com.jakewharton.threetenabp:threetenabp:1.0.3'
  • Sau đó, tôi đã cố gắng - compile 'org.threeten:threetenbp:1.0.3'
  • Sau đó, Tôi đã thử - compile 'org.threeten:threetenbp:1.3.1'
  • Hiện tại, tôi sử dụng compile 'org.threeten:threetenbp:1.3.2'

Tôi không biết có gì sai với dòng mã đó và cách khắc phục.
Các phương pháp LocalDate.now()LocalTime.now() sẽ hoạt động mà không chỉ định múi giờ.

Trả lời

24

Đối với dự án Android bạn nên sử dụng

compile 'com.jakewharton.threetenabp:threetenabp:1.0.3 

Đảm bảo bạn gọi AndroidThreeTen.init(this); trước khi sử dụng các lớp từ thư viện. Điều này sẽ đọc dữ liệu múi giờ (có trong thư viện). Bạn có thể khởi tạo thư viện trong lớp Application của mình trong phương thức onCreate giống như được đề xuất trong README.

+2

Cảm ơn bạn, dự án của tôi trước đây chưa có lớp ứng dụng, vì vậy tôi không thể sử dụng mã 'AndroidThreeTen.init (this); '. Tôi nghĩ để thêm vào phương thức 'onCreate' của hoạt động nhưng tôi thấy nó không đúng. Bây giờ tôi đã tạo một lớp mới mở rộng lớp ứng dụng và đặt dòng đó vào phương thức 'onCreate'. Bây giờ mọi thứ hoạt động rất tốt! –

+1

Gọi init in onTạo vi phạm nghiêm ngặt và thậm chí có thể trì hoãn khởi động ứng dụng. Nếu bạn gọi init không đồng bộ, bạn phải đảm bảo không sử dụng nó cho đến khi nó hoàn thành, điều này có thể khó khăn cho việc kiểm tra JUnit. –

+4

@ErikB nó vi phạm chế độ nghiêm ngặt vì nó đọc tệp múi giờ từ nội dung để nó làm chậm thời gian khởi động. Đối với các bài kiểm tra đơn vị, bạn nên sử dụng thư viện gốc http://www.threeten.org/threetenbp/ vì thư viện này có các phụ thuộc Android như được giải thích tại đây https://github.com/JakeWharton/ThreeTenABP/issues/14 – LordRaydenMK

Các vấn đề liên quan