2014-09-04 24 views
5

Sto usando LibGDX. All'avvio della mia app, viene creata una schermata. Quando lo schermo è caricato, chiama una funzione statica Module.createStyles().NullPointerExceptions solo su alcuni dispositivi Samsung Galaxy?

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).

Quando lo schermo è terminato, chiama Module.disposeStyles().

In ogni caso, in base alle mie segnalazioni sugli arresti anomali di Google Analytics, ho casualmente ottenere un NullPointerException quando si cerca di, ad esempio, creare un 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 alcun motivo Module.dialogStyle dovrebbe essere nullo. L'unico posto in cui viene annullato questo campo è in Module.disposeStyles() e questa funzione viene richiamata solo in un punto specifico dell'applicazione (alla fine).

Suppongo che questo sia stato un errore nel mio codice in qualche modo anche se il 95% degli utenti non lo ha mai provato. Tuttavia, tutti e 5% che non la vive sembrano essere gli utenti Galaxy e non sono sicuro se questo è 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?

+2

Probabilmente la raccolta dei rifiuti è nuovo e migliorato per essere il migliore nella Galassia in modo che il dispositivo ha sempre più RAM rispetto alla concorrenza . Ho avuto problemi in generale (non ho una galassia) nel codice che salva il contesto in un campo globale. Una volta eliminati, molti problemi sono andati via. Inoltre, non uso più suDispose onDestroy, ma eseguo tutte le operazioni di cleanup in onStop. – danny117

+0

Non sei sicuro del motivo per cui il tuo stile ha improvvisamente puntato su null con i dispositivi Galaxy e potrebbe essere difficile capirlo senza testarlo su quei dispositivi. Puoi aggiungere un controllo Null per lo stile prima di creare la finestra di dialogo e, nel caso di uno stile nullo, generare un evento di Google Analytics con altre informazioni aggiunte. (e esce dallo schermo senza dialog ..) In questo modo, almeno gli utenti non notano il bug e puoi continuare a seguirlo. – donfuxx

risposta

4

ho intenzione di assumere che:

Module.dialogStyle 

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

Probabilmente ti stai imbattendo in 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, i puntatori static possono passare da una precedente esecuzione dell'applicazione a quella successiva e potrebbero avere uno stato non valido o errato in essi. Dipende dai dettagli di come è organizzata la tua app.

Se si include più del codice che mostra come e quando si inizializzano i campi statici, possiamo probabilmente capirlo.

Per maggiori dettagli sui diversi cicli di vita e come riprodurre localmente, vedi: http://bitiotic.com/blog/2013/05/23/libgdx-and-android-application-lifecycle/

+0

Sì, hai ragione sul fatto che sia una proprietà statica. Interessante, però, non sapevo che solo alcune parti della tua app possono essere compromesse in memoria, ho pensato che fosse tutto o niente. Penso di poter fare a meno di controllare questi membri statici quando viene chiamato 'onResume()' e verificare che essi esistano ancora. – FTLRalph