2015-04-06 5 views
6

Dank dieser Antwort Android Fragment lifecycle issue (NullPointerException on onActivityResult) Ich habe es geschafft, ein Szenario neu zu erstellen, wenn ich nach dem Aufruf von startActivityForResult eine NPE in meinem Fragment erhalte. So ich habeAndroid-Fragment wird zerstört und empfängt onActivityResult

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
photoPickerIntent.setType("image/*"); 
startActivityForResult(photoPickerIntent, PHOTO_SELECT_REQUEST_CODE); 
break; 

von meinem Fragment genannt wird, dann meine Tätigkeit onPause, OnStop und onDestroy empfängt, so dass das Fragment, das startActivityForResult genannt bekommt eine onDestroy auch. Nachdem ich ein Bild ausgewählt habe, erhalte ich ein neues onCreate für meine Aktivität und dann bekomme ich eine public void onActivityResult auf meinem ursprünglichen Fragment, das jetzt zerstört ist.

Meine Frage ist, da dies potentiell (wenn auch eine seltene) Situation ist, wie würde man den gesamten Stapel von Fragmenten und Objekten wiederherstellen und was würde man tun, um zu verhindern, dass das ursprüngliche Fragment ausläuft?

+0

Sind Sie sicher, dass bei der Implementierung der onActivityResult zu alten Fragment geliefert wird? Haben Sie versucht, das Fragmentobjekt (this) in onCreate/onCreateView und onActivityResult zu protokollieren? Dadurch erhalten Sie eine klare Vorstellung davon, welches Fragment das onActivityResult aufgerufen wird. –

Antwort

0

Wenn Ihr Code führt folgende Zeile ein:

startActivityForResult(photoPickerIntent, PHOTO_SELECT_REQUEST_CODE); 

Ihre Aktivität onPause() erhalten wird, onStop() aber nicht onDestroy() jedes Mal. Wenn Android-System ist, kann onDestroy() aus dem Speicher zu dieser Laufzeit dann Ihre Tätigkeit erhält

Für den Zustand des Fragments und Aktivität zu sparen und verhindert undicht:

Speichern Sie Ihren Zustand in onSaveInstanceState(Bundle)

In Situationen, in denen Das System benötigt mehr Arbeitsspeicher und kann pausierte Prozesse (nach onPause()) zum Zurückfordern von Ressourcen beenden. Aus diesem Grund sollten Sie sicher sein, dass Ihr gesamter Status gespeichert ist, wenn Sie von dieser Funktion zurückkehren. Im Allgemeinen onSaveInstanceState(Bundle) wird verwendet, pro Instanz Zustand der Aktivität und dieses Verfahren verwendet globale persistente Daten zu speichern, zu speichern (in Content-Provider, Dateien usw.)

Wiederherstellen Zustand in onRestoreInstanceState(Bundle)

onRestoreInstanceState(Bundle) Methode wird nach onStart() aufgerufen, wenn die Aktivität aus einem zuvor gespeicherten Zustand neu initialisiert wird, hier in savedInstanceState. Die meisten Implementierungen verwenden einfach onCreate(Bundle), um ihren Status wiederherzustellen, aber es ist manchmal bequem, dies nach Abschluss der Initialisierung zu tun, oder um es Unterklassen zu ermöglichen, zu entscheiden, ob sie Ihre Standardimplementierung verwenden möchten. Die Standardimplementierung dieser Methode führt eine Wiederherstellung jedes Ansichtsstatus durch, der zuvor von onSaveInstanceState(Bundle) eingefroren wurde.

Diese können Sie Ihre Anforderung

+0

danke für deine antwort. Ich habe die Logik für die Neuerstellung der Aktivität und Fragmente basierend auf onSaveInstanceState/onRestoreInstanceState-Listenern implementiert. Ich bin jedoch immer noch mit dem "übrig gebliebenen" Fragmentproblem konfrontiert. Da es registriert ist, um Aktivitätsergebnisse zu erhalten, wird es nicht für GC markiert, und ich kann mir keine gute Möglichkeit vorstellen, dieses Ergebnis in die Fragmente, die neu erstellt werden, weiterzuleiten. –

+0

@DmitryGolomidov Haben Sie die Antwort gefunden? Ich stehe vor demselben Problem. – kong