Effetti indesiderati imprevisti durante l'analisi delle date in Android

In vari progetti Android, utilizzo la seguente function statica per analizzare date come il 1900-12-31 . Naturalmente, questa function dovrebbe essere deterministica – ma si scopre che non lo è. Perché?

Normalmente, analizza la data 2010-10-30 , per esempio, all'istanza corretta di Date contenente tale valore. Ma ho notato che quando ho un IntentService esecuzione allo stesso tempo e analizzando alcune date, questa function analizza la stessa data di cui sopra al 1983-01-20 , che è una delle date analizzate in IntentService . Come può accadere questo?

  • La window di dialogo Android scompare da solo
  • getSupportFragmentManager () non è definito
  • Gradle: Nessun tipo di risorsa specificato (a 'text' con valore '@ {user.name}'). Databinding non funziona
  • i divisori tra TabWidgets
  • Styling Text in un'elenco di dialogo
  • Android: Sfondo del button di cambio in Riga di ListView con onClick
  •  public static Date dateFromString(String dateStr) { SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); SimpleDateFormat mDateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.getDefault()); Date dateOut = null; try { if (dateStr != null) { if (dateStr.length() == 7) { if (dateStr.startsWith("--")) { dateStr = "0000"+dateStr.substring(1); } } else if (dateStr.length() == 6) { if (dateStr.startsWith("-")) { dateStr = "0000"+dateStr; } } else if (dateStr.length() == 5) { dateStr = "0000-"+dateStr; } else if (dateStr.matches("[0-9]{2}\\.[0-9]{2}\\.[0-9]{4}")) { dateStr = dateStr.substring(6, 10)+"-"+dateStr.substring(3, 5)+"-"+dateStr.substring(0, 2); } else if (dateStr.matches("[0-9]{2}\\/[0-9]{2}\\/[0-9]{4}")) { dateStr = dateStr.substring(6, 10)+"-"+dateStr.substring(3, 5)+"-"+dateStr.substring(0, 2); } else if (dateStr.matches("[0-9]{8}")) { dateStr = dateStr.substring(0, 4)+"-"+dateStr.substring(4, 6)+"-"+dateStr.substring(6, 8); } if (dateStr.length() >= 20) { String dateTimeStr = dateStr.trim(); if (dateTimeStr.endsWith("Z")) { dateTimeStr = dateStr.substring(0, dateTimeStr.length()-1)+"+0000"; } if (dateStr.charAt(10) == ' ') { dateTimeStr = dateStr.substring(0, 10)+"T"+dateStr.substring(11); } try { dateOut = mDateTimeFormat.parse(dateTimeStr); } catch (Exception e2) { dateOut = mDateFormat.parse(dateStr); } } else { dateOut = mDateFormat.parse(dateStr); } } } catch (Exception e) { dateOut = null; } return dateOut; } 

    Modifica: faccio l'analisi nella onCreate() cui inizio AsyncTask che fa il lavoro. Nell'attività di onStop() , viene avviato un servizio di background che fa lo stesso lavoro. Quando chiudo l'applicazione (onStop ()) e riavvia rapidamente (onCreate ()), entrambi sembrano funzionare contemporaneamente e l'errore si verifica.

  • Gradle build-info.xml non trovato per l'applicazione di module in Android Studio
  • Imansible visualizzare l'image dei dati dei contatti in phonegap
  • Nascondi titolo ActionBar solo per un'attività
  • Qual è il modo più semplice per get un tracciato di crash stack da Android?
  • Popup o layout sul marker Android
  • Dispositivo GPS Android acceso / spento programmaticamente
  • One Solution collect form web for “Effetti indesiderati imprevisti durante l'analisi delle date in Android”

    La documentazione di SimpleDateFormat dice:

    SimpleDateFormat non è thread-safe. Gli utenti devono creare un'istanza separata per each thread.

    Là andrai. Basta creare l'object SimpleDateFormat separatamente in ciascun thread e passarlo al metodo.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.