Immagini e sfondi mancanti o errati in modo casuale durante tutto il ciclo di vita dell’app

Speravo che qualcuno qui potesse avere un’idea di cosa provoca questo tipo di comportamento:

Durante la mia applicazione, in posti apparentemente casuali e in condizioni casuali, sto osservando questo strano problema dell’interfaccia utente. A volte le immagini vengono caricate in nero (con i limiti corretti) o con l’origine dell’immagine errata (di nuovo, con i limiti corretti). Questo ha effetto su ImageViews e ha riguardato android:background tag di android:background con riferimenti a risorse di colore.

La mia applicazione si basa su 6 progetti di libreria, esegue il codice nativo tramite un servizio e le attività nell’app utilizzano GlSurfaceViews (anche se non tutte le attività che mostrano il problema contengono componenti OpenGL). Il problema potrebbe essere da uno di questi posti o una combinazione di essi attraverso l’utilizzo di grandi quantità di memoria.

Puoi vedere questo comportamento nelle seguenti schermate:

  • Si tratta in realtà di un’immagine di separatore di colonne di circa 6 pixel che è stata erroneamente disegnata nel mio ImageView (sembra che le dimensioni di ImageView siano correttamente dimensionate).

    Strappato

  • Quando si esce dall’applicazione e poi si riaccende (ripetutamente) appare invece (e rimane) in questo modo:

    Nero

  • Dopo un Force Clear e un Clear App Data, è tornato al formato corretto:

    Questo è l'originale:

Come puoi anche vedere l’immagine della lente di ingrandimento accanto a essa sta visualizzando bene in ciascuno di questi. I problemi con queste immagini e sfondi mancanti / errati sembrano avvenire casualmente, durante il ciclo di vita dell’applicazione, e non sono riuscito a trovare un modo per riprodurlo.

I layout di queste immagini non sono niente di speciale, non sto facendo niente di divertente durante il ciclo di vita del rendering (non sto ignorando onDraw() o onMeasure() o simili). La fonte di queste immagini non viene impostata dynamicmente ma tramite l’XML.

Come puoi vedere dall’esempio precedente, non si tratta di un problema di build in quanto si verifica tra i cicli di vita delle app e non tra le installazioni. Sta accadendo anche su diversi dispositivi, Samsung 8.9, Acer Iconia Tab, Motarola XOOM,

Mi sembra una sorta di errore con la tabella di riferimento, potrebbe forse essere stato modificato dal mio codice nativo? O è un effetto di me in alcune fasi dell’applicazione che utilizza troppa memoria?

Ecco la fonte XML per l’esempio precedente:

        

Una descrizione più completa del codice / layout che circonda un altro evento del genere mi è capitato di ottenere lo screenshot di:

Ho un’attività “Impostazioni” che riavvia la mia app dopo aver salvato i nuovi dettagli delle impostazioni. Lo fa fermando un Service , chiamando una nuova Activity (l’attività di Splash) e finendo se stesso:

  mConfiguration.save(); mConfiguration = new Configuration(Configuration.getInstance()); getActivity().stopService(new Intent(getActivity(), NativeService.class)); getActivity().finish(); startActivity(new Intent(getActivity(), SplashActivity.class)); 

Il più delle volte (e sulla maggior parte dei dispositivi) funziona bene, l’attività Splash contiene un’immagine che si carica correttamente. A volte su alcuni dispositivi l’attività Splash carica una risorsa errata (ciò che i miei tester chiamano “un segno di spunta Nike rovesciato”) o solo una casella vuota (come mostrato sotto). Qualcuno sa perché?

inserisci la descrizione dell'immagine qui

Ecco il layout per la pagina Splash, come puoi vedere è piuttosto semplice, senza sorprese:

         

Teoria testata e debellata:

Ho teorizzato che potrebbe trattarsi di un problema di processore / memoria in cui il layout non viene disegnato completamente prima che la schermata Splash esca e passi alla prossima attività, quindi inserisco questa parte di codice:

  image = (ImageView) findViewById(R.id.image); image.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { image.getViewTreeObserver().removeGlobalOnLayoutListener(this); moveToStartScreen.start(); } }); 

La speranza era che il codice sopra avrebbe assicurato che l’immagine fosse caricata definitivamente prima di passare alla pagina iniziale, ma sembra non aver avuto alcun effetto osservabile.

Un’altra teoria

Mi stavo anche chiedendo se questo potrebbe essere causato dalle risorse R.id / R.colour / R.drawable da alcuni come essere stati sottoposti all’esecuzione del programma? Qualcuno sa perché potrebbe accadere.

Potrebbe il mio codice nativo essere in esecuzione su alcuni indirizzi di memoria che Android non sta allocando correttamente?

Qualcuno ha notato questo prima – o forse sa perché questo comportamento si verifica?

Graeme, ho avuto quasi lo stesso problema e ho scoperto che si trattava di un bug segnalato dalla piattaforma Android. È stato corretto nella versione 3.0, credo. Con quale API stai compilando? Prova a build con l’ultima API disponibile e assicurati di compilare con JDK 1.6

Se il tuo problema è legato a questo bug, questo dovrebbe risolvere il problema.

Questo è un semplice problema di aggiornamento, pulizia e ricostruzione. Le immagini nelle varie cartelle disegnabili o negli indici di identificazione delle risorse sono fuori sequenza perché sono state cambiate al di fuori dell’IDE di eclipse (tramite controllo sorgente esterno come GIT, SVN o altre modifiche) e non sono state aggiornate nel navigatore di eclipse. In alternativa, i file potrebbero essere stati aggiornati in un progetto di libreria dal quale dipende l’attività dell’interfaccia utente.

Ho scoperto che sebbene le dipendenze dei file .java siano propagate in tutto il sistema, questo non è sempre il caso per risorse come immagini e file .xml.

La soluzione è abbastanza semplice, pulire tutto, aggiornare tutti i progetti e ribuild. I bordi allungati o neri dovrebbero essere spariti.

Nota: la manifestazione predominante di questo problema si verifica quando le immagini a 9 patch vengono trattate come immagini .png standard. Ciò significa che vengono allungati in modo lineare sull’immagine anziché solo sui bordi. Per me, questo spiega il tuo esempio ‘strappato / allungato’. Ho visto spesso simili. Un’altra manifestazione comune è che le stringhe di testo vengono visualizzate occasionalmente con risorse sbagliate!