2014-12-06 10 views
7

Sto lavorando a un'applicazione Android con più attività e servizi. Alcune attività sono definite in librerie di terze parti che sto importando nel mio progetto e il problema è che su alcuni dispositivi (specialmente nei Samsung Galaxy Tab) la mia app continua a bloccarsi quando si passa da un'attività alla precedente tramite clic sul retro pulsante.Come scoprire cosa causa BadTokenExceptions

ho fatto un LogCat e abbiamo trovato questo per essere la causa dei crash:

android.view.WindowManager$BadTokenException: Unable to add window -- token 
    [email protected] is not valid; is your activity running? 
at android.view.ViewRootImpl.setView(ViewRootImpl.java:562) 
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:272) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365) 
at android.app.ActivityThread.access$800(ActivityThread.java:144) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5221) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

ma la cosa interessante è che nessuna delle classi della mia applicazione appare sulla traccia dello stack. Ho cercato problemi simili su StackOverflow ma ogni altro rapporto che ho trovato aveva una traccia dello stack di una BadTokenException, il codice dell'applicazione corrispondente appariva sempre nella traccia dello stack.

Qualcuno sa quali sono le cause più comuni di questo problema e/o il modo migliore per risolverlo? Ho notato che questo problema si verifica più sui dispositivi Samsung, quindi forse è un bug reale su quei dispositivi.

+0

sei riuscito a trovare una causa/correzione per il problema? – kiruwka

+1

Sì. Il problema era che il mio codice aveva un listener di eventi che conteneva un riferimento a un TextView. Questo contesto di TextView era un'attività che era già stata distrutta e che il 'BadTokenException' veniva lanciato quando il listener provava a chiamare' setText() '. Il più delle volte ciò ha provocato un errore non presidiato, ma su alcuni dispositivi causava il lancio di un'eccezione nel thread dell'interfaccia utente e l'arresto anomalo dell'applicazione. –

+0

interessante. Come sei riuscito a individuarlo in 'setText'? Hai usato registri aggiuntivi (forse stacktraces di altri thread? Pensi che potresti pubblicare una risposta con qualche codice/indicazioni su come eseguire il debug di questo, sarebbe molto apprezzato. Grazie! – kiruwka

risposta

0

solito BadTokenExceptions si verificano quando l'attività tenta di creare un nuovo Window prima del suo metodo onAttachToWindow() si chiama (o dopo il suo metodo onDetachFromWindow() viene chiamato). Potrebbe benissimo essere che le librerie di terze parti che stai utilizzando siano buggate e non garantiscano il rispetto di questo requisito.

+1

Sto avendo la stessa traccia di strack (in produzione, non riproducibile localmente). Potresti raccomandare qualche approccio per individuare il codice/scenario che potrebbe causare questo? Ho provato il suggerimento dal commento di OP senza fortuna di riprodurlo. Mi piacerebbe davvero aggiustarlo. Grazie molto. – kiruwka

Problemi correlati