2016-01-07 16 views
13

Dopo aver aggiunto l'uscita ed entrare transizioni di attività ad un app, sto ottenendo segnalazioni di crash come la seguente:EnterTransitionCoordinator provoca NPE in Android 5.0

irreversibile: java.lang.NullPointerException: Tentativo di richiamare metodo virtuale 'android.view.ViewParent android.view.View.getParent()' su un oggetto nullo di riferimento su android.view.ViewOverlay $ OverlayViewGroup.add (ViewOverlay.java:164) su android.view.ViewGroupOverlay.add (ViewGroupOverlay.java:63) a android.app.EnterTransitionCoordinator.startRejectedAnimations (EnterTransitionCoordinator.java:598) 01.235.164,106174 millionsa android.app.EnterTransitionCoordinator.startSharedElementTransition (EnterTransitionCoordinator.java:325) a android.app.EnterTransitionCoordinator.access $ 200 (EnterTransitionCoordinator.java:42) a android.app.EnterTransitionCoordinator $ 5 $ 1.run (EnterTransitionCoordinator.java:389) a android.app.ActivityTransitionCoordinator.startTransition (ActivityTransitionCoordinator.java:698) a android.app.EnterTransitionCoordinator $ 5.onPreDraw (EnterTransitionCoordinator.java:386) a android.view.ViewTreeObserver.dispatchOnPreDraw (ViewTreeObserver.java:847) su android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1985) su android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1077) su android.view.Vi ewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:5845) su android.view.Choreographer $ CallbackRecord.run (Choreographer.java:767) su android.view.Choreographer.doCallbacks (Choreographer.java:580) su Android. view.Choreographer.doFrame (Choreographer.java:550) su android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:753) su android.os.Handler.handleCallback (Handler.java:739) su Android. os.Handler.dispatchMessage (Handler.java:95) su android.os.Looper.loop (Looper.java:135) su android.app.ActivityThread.main (ActivityThread.java:5272) su java.lang. reflect.Method.invoke (Method.java) a java.lang.reflect.Method.invoke (Method.java:372) a com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:909) a com.android.internal.os.ZygoteInit.main (ZygoteInit.java:704)

Non è riproducibili, ma il conteggio incidente è significativo.

Facendo qualche ricerca, mi sono imbattuto in questo commit nel quale viene (era in realtà) un errore interno in Android: https://android.googlesource.com/platform/frameworks/base/+/83c692efd3c53050fce132dfd2ef21763d3cf010%5E%21/#F0

Tutte le segnalazioni di crash sono o 5.0, 5.0.1 o 5.0.2. Perché 5.1 ha maggiore diffusione, ma non mostra si blocca, sembra che EnterTransitionCoordinator è stato fissato a 5,1.

Quindi, una possibile soluzione sarebbe quella di controllare il livello di API 22 o superiore, e solo le transizioni poi. Tuttavia mi chiedo se c'è un modo migliore; qualche soluzione forse, nonostante questo sembra essere una questione interna di Android (tutte le classi di sistema nello stack)?

+1

Penso che il Play Store abbia lo stesso controllo per 5.1. – vRallev

+0

Succede con tutto il cellulare? Non riesco a riprodurlo con un emulatore (genymotion) con la versione 5.0.x –

+0

Non è realmente riproducibile. Tieni d'occhio i rapporti sugli arresti anomali se si applica alla tua app. –

risposta

6

Dopo aver richiesto il livello API 22 (Android 5.1) per la transizione, i crash sono spariti. Quindi questa è la soluzione più semplice. Se devi supportarlo con Android 5.0, controlla la risposta di Nikola (non abbiamo provato noi stessi per evitare codice aggiuntivo).

3

Per un numero di API inferiore a 5.1, posticipare la transizione dell'elemento condiviso utilizzando postponeEnterTransition(). Registrare un listener OnDrawListener nella vista decor (forse) o nel contenuto (android.R.id.content) e avviare la transizione una volta onDraw(). Non dimenticate di annullare la registrazione l'ascoltatore, una volta che si avvia la transizione.

+3

quando faccio questo, 'OnDdraw()' non viene mai chiamato. – Boy

3

Questo bug del sistema operativo Android si riferisce alla gestione di elementi "rifiutati" durante la transizione dell'elemento condiviso. Un elemento condiviso verrà rifiutato (escluso dalla transizione) se non è collegato alla finestra, il che potrebbe accadere perché la sua visibilità è impostata su GONE.

La soluzione alternativa che sto utilizzando è controllare ciascuna potenziale vista di elementi condivisi prima di chiamare makeSceneTransitionAnimation() e includerla nell'elenco solo se la visibilità è impostata su VISIBLE.

+0

questa soluzione è l'unica che funziona davvero –