java - NullPointerExceptions solo su alcuni dispositivi Samsung Galaxy?





android libgdx (2)


Assumerò che:

Module.dialogStyle

è un riferimento a una proprietà static nella classe Module .

Probabilmente stai riscontrando effetti collaterali di come Android gestisce il ciclo di vita delle JVM. Esistono scenari (in particolare su dispositivi più grandi) in cui verrà riutilizzata un'istanza JVM che può causare problemi (ad esempio, gli inizializzatori statici sono già stati eseguiti e non verranno rieseguiti). In alternativa, static puntatori static possono vivere da una precedente esecuzione della tua applicazione alla successiva e potrebbero avere uno stato non valido o errato in essi. Dipende dai dettagli di come è organizzata la tua app.

Se includi più codice che mostra come e quando inizializzi i campi statici, possiamo probabilmente capirlo.

Per ulteriori dettagli sui diversi cicli di vita e su come riprodurli localmente, consultare: http://bitiotic.com/blog/2013/05/23/libgdx-and-android-application-lifecycle/

Sto usando LibGDX. All'avvio della mia app, viene creata una schermata. Quando lo schermo è caricato, richiama una funzione statica Module.createStyles() .

Questa funzione crea una serie di stili che verranno utilizzati nel resto dell'applicazione (stili LibGDX incorporati come WindowStyle, LabelStyle, TextButtonStyle - tutti i tipi di cose utilizzate per creare gli oggetti dell'interfaccia utente).

Al termine dello schermo, chiama Module.disposeStyles() .

Ad ogni modo, secondo i miei rapporti sugli arresti anomali di Google Analytics, ottengo casualmente una NullPointerException quando provo , ad esempio, a creare una finestra di dialogo con Module.dialogStyle :

ExitDialog exitDialog = new ExitDialog("Are you sure?", Module.dialogStyle);

Thread: GLThread 2089, Exception: java.lang.IllegalArgumentException: style cannot be null.
at package.Window.setStyle(Window.java:181)
at package.Window.<init>(Window.java:63)
at package.Dialog.<init>(Dialog.java:65)
at package.ExitDialog$1.<init>(ExitDialog.java:38)

Non c'è assolutamente alcuna ragione per cui Module.dialogStyle debba essere nullo. L'unico posto in cui viene Module.disposeStyles() questo campo è in Module.disposeStyles() e questa funzione viene richiamata solo in un punto specifico dell'applicazione (alla fine).

Immagino che questo sia stato un bug nel mio codice in qualche modo, anche se il 95% degli utenti non lo ha mai sperimentato. Tuttavia, tutti i 5% che fanno esperienza sembrano essere utenti Galaxy e non sono sicuro che sia una coincidenza:

  • Galaxy s4
  • Galaxy S III
  • GALAXY Tab 3 lite

Qualcuno ha qualche idea? I dispositivi Galaxy non dispongono di un gestore RAM incorporato? Avrebbe qualcosa a che fare con questo?




Utilizzando il codice riportato di seguito, è possibile ottenere l'ID dispositivo univoco di un dispositivo con sistema operativo Android come una stringa.

deviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 




java android nullpointerexception libgdx galaxy