2012-04-29 11 views
7

Ho scritto un'app e ora, dopo il rilascio, alcuni dei miei utenti sembrano avere un bug sgradevole. Uno che sono semplicemente incapace di riprodurre.Android onActivityResult. La variabile membro è talvolta nullo

Coinvolti in questo sono tre attività.

Attività 1: SuperActivity

public abstract class SuperActivity extends Activity 

Attività 2: MainActivity

public class MainActivity extends SuperActivity { 

    private MyObject myMemberVariable;  

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

    //Get the intent that started this activity. I am always providing Extras, so this is never null. 
    Bundle bundle = getIntent().getExtras(); 

    //Set stuff in myMemberVariable from these extras. This never fails either. 
    myMemberVariable = BundleLoader.loadFromBundle(bundle); 

    } 


    @Override 
    public void onListDialogClick(int requestCode, String[] options, int position, String extra) { 
    //THIS is the place where, according to my stacktrace from the DeveloperConsole, the null pointer arises. 
    myMemberVariable.setXY(position); 
    } 

Attività 3: ListDialogActivity

public class ListDialogActivity extends SuperActivity 

Quello che sto facendo qui è che avviare il ListDialogActivity da MainActivity per presentare all'utente alcune scelte. Una volta effettuata una selezione, ListDialogActivity imposterà un risultato e quindi terminerà. Nel SuperActivity ho:

onActivityResult(int requestCode, int resultCode, Intent data) { 
    //if activityRequestCode was ListDialogRequestCode and the Result was RESULT_OK, then call onListDialogClick(..) with the appropriate values. 
} 

Quindi questo è come viene richiamato l'onListDialogClick() nel mio MainActivity (Così si può solo pensare ad esso come un onActivityResult normale()). Lì, alcuni utenti riscontrano un'eccezione di puntatore nullo perché myMemberVariable è null.

Non riesco a capire cosa sta succedendo qui. Inoltre, sto salvando il mio stato di istanza per gestire le rotazioni del telefono, ma anche se non lo facessi, poiché il onCreate sarebbe stato richiamato, non sarebbe ancora nullo, avrebbe solo perso il suo stato e sarebbe stato ricreato dall'Intent iniziale.

Qualcuno può spiegarmi come è possibile e cosa sta succedendo qui? Ho dimenticato qualcosa da Android? Perché succede solo a poche persone? Quale potrebbe essere la ragione di questo? Sarei davvero grato anche per il più piccolo suggerimento.

Grazie mille!

+1

Qualsiasi fattore comune con i dispositivi su cui si sta verificando? – JRaymond

+0

Non ho ancora trovato un fattore comune (sono sicuro che sia successo a qualcuno con un Galaxy S2 con CM9 ea qualcuno con un HTC uno x.) Ma a parte questo non lo so perché la console di sviluppo non lo fa mostrami i dispositivi dai quali provengono gli errori. – metter

+1

dove è stato inizializzato 'myMemberVariable'? Nel codice posso vedere che deve essere sempre nullo perché è uguale a 'private MyObject myMemberVariable = null;' – zapl

risposta

10

zapl è corretto in quanto è necessario salvare i valori in onSaveInstanceState e nel mio caso sto ripristinando in onCreate() che viene eseguito PRIMA di onActivityResult, quindi non più NullPointerExceptions!

Probabilmente avete già risolto questo problema, ma stavo avendo una gran quantità di problemi con lo stesso problema. La mia app avvia la fotocamera per scattare una foto, quindi copia il file acquisito nella directory corrente nell'app. Occasionalmente, quando la foto è stata scattata, stavo ricevendo NullPointerExceptions in onActivityResult.

Mi ci è voluto un po 'per capire che l'attività doveva essere stata eliminata dalla gestione della memoria degli androidi e ricreata, perdendo così tutte le variabili dei miei membri. Questo non era ovvio (i cappelli ad Android per un kill/restore così perfetto!). Ciò accadeva su un HTC Desire HD ed era così casuale che era molto difficile rintracciare.

+0

Grazie mille per questa risposta! Ho avuto lo stesso problema e non ero in grado di capirlo. Ben fatto;) –

+1

Wow, 5 anni dopo, ancora rilevante, e mi ha salvato il culo; grazie per questo. Un bug così sfuggente! – pete

Problemi correlati