2016-07-09 50 views
14

Sto utilizzando la libreria ThreeTen-Backport per il mio progetto Android (perché java.time non è ancora implementato nello sviluppo di Android).Errore ThreeTen-Backport su Android - ZoneRulesException: nessun file di dati di fuso orario registrato

Quando scrivo LocalDate today=LocalDate.now(); o LocalTime time=LocalTime.now(); ottengo la seguente eccezione:

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) 

La stessa riga di codice funziona bene in un altro progetto java che ho, che usa la libreria java.time nativo.

Ho cercato una soluzione possibile ma non ho trovato nulla di utile: una soluzione suggerita Ho bisogno di usare un altro jar che includa le regole del fuso orario e altri suggeriscono che ci potrebbero essere due o più librerie ThreeTenBP all'interno del classpath .
Questi casi non corrispondono al mio caso.

All'interno del file build.gradle, presso la sezione di dipendenze, ho provato alcune configurazioni:

  • In un primo momento, ho usato - compile 'com.jakewharton.threetenabp:threetenabp:1.0.3'
  • Poi, ho provato - compile 'org.threeten:threetenbp:1.0.3'
  • Dopo di che, Ho provato - compile 'org.threeten:threetenbp:1.3.1'
  • Attualmente, io uso compile 'org.threeten:threetenbp:1.3.2'

Non so cosa c'è di sbagliato in quella riga di codice e come risolverlo.
I metodi LocalDate.now() e LocalTime.now() dovrebbero funzionare senza specificare un fuso orario.

risposta

24

Per progetto Android si dovrebbe usare

compile 'com.jakewharton.threetenabp:threetenabp:1.0.3 

Assicurati di chiamare AndroidThreeTen.init(this); prima di utilizzare le classi dalla libreria. Questo leggerà i dati dei fusi orari (inclusi nella libreria). È possibile inizializzare la libreria nella classe Application nel metodo onCreate proprio come si consiglia nello README.

+2

Grazie, il mio progetto non aveva una classe di applicazione prima, quindi non ero in grado di utilizzare il codice 'AndroidThreeTen.init (this); Ho pensato di aggiungere questo nel metodo 'onCreate' dell'attività, ma ho visto che non era giusto. Ora ho creato una nuova classe che estende la classe dell'applicazione e la inserisce nel metodo 'onCreate'. Ora tutto funziona alla grande! –

+1

Chiamare init in onCreate viola la modalità strict e può persino ritardare l'avvio dell'app. Se chiami init in modo asincrono, devi assicurarti di non usarlo fino a quando non viene completato, il che può essere difficile per il test di JUnit. –

+4

@ErikB viola la modalità strict perché legge il file dei fusi orari dalle risorse, quindi ritarda il tempo di avvio. Per i test unitari dovresti utilizzare la libreria originale http://www.threeten.org/threetenbp/ perché questa ha dipendenze da Android come spiegato qui https://github.com/JakeWharton/ThreeTenABP/issues/14 – LordRaydenMK