2015-04-06 30 views
6

dzięki tej odpowiedzi Android Fragment lifecycle issue (NullPointerException on onActivityResult) Udało mi się odtworzyć scenariusz po otrzymaniu NPE w moim fragmencie po wywołaniu funkcji startActivityForResult. więc mamFragment Androida jest niszczony, ale otrzymuje OnActivityResult

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

miano od mojego fragmentu, wtedy moja aktywność otrzymuje OnPause, OnStop i onDestroy, więc fragment, który nazywa startActivityForResult dostaje onDestroy również. Po wybraniu obrazu otrzymuję nowy element onCreate dotyczący mojej aktywności, a następnie otrzymuję public void onActivityResult na moim oryginalnym fragmencie, który jest teraz zniszczony.

Moje pytanie brzmi, ponieważ jest to potencjalnie (aczkolwiek rzadka) sytuacja, w jaki sposób można przywrócić cały stos fragmentów i obiektów przekazanych im oraz co zrobić, aby zapobiec wyciekowi oryginalnego fragmentu?

+0

Czy jesteś pewien, że onActivityResult jest dostarczane do starego fragmentu? Czy próbowałeś zalogować obiekt fragmentu (this) w onCreate/onCreateView i onActivityResult? To da ci jasne pojęcie, który fragment nazywa się onActivityResult. –

Odpowiedz

0

Kiedy Twój kod wykonuje następującą linię:

startActivityForResult(photoPickerIntent, PHOTO_SELECT_REQUEST_CODE); 

Twoja aktywność będzie onPause(), onStop() ale nie onDestroy() razem. W przypadku systemu Android jest z pamięcią w tamtym czasie wykonywania następnie swoją działalność może uzyskać onDestroy()

Do zapisywania stanu fragmentu i aktywności, zapobiega wyciekaniu:

Zapisz swój stan w onSaveInstanceState(Bundle)

w sytuacjach, gdy system potrzebuje więcej pamięci, może zabić wstrzymane procesy (po onPause()), aby odzyskać zasoby. Z tego powodu powinieneś być pewien, że cały twój stan zostanie zapisany przed powrotem z tej funkcji. W ogólnym onSaveInstanceState(Bundle) służy do zapisywania stanu per-instancji w działalność i ta metoda jest używana do przechowywania danych globalnych trwałych (w dostawców treści, plików, itp)

Przywracanie stanu w onRestoreInstanceState(Bundle)

onRestoreInstanceState(Bundle) Metoda jest wywoływana po onStart(), gdy aktywność jest ponownie inicjalizowana z wcześniej zapisanego stanu, podanego tutaj w savedInstanceState. Większość implementacji po prostu użyje onCreate(Bundle), aby przywrócić ich stan, ale czasami wygodnie jest to zrobić tutaj po wykonaniu całej inicjalizacji lub zezwoleniu subklasom na podjęcie decyzji, czy użyć domyślnej implementacji. Domyślna implementacja tej metody powoduje przywrócenie dowolnego stanu widoku, który został wcześniej zamrożony przez onSaveInstanceState(Bundle).

To może pomóc Ci realizować swoje wymagania

+0

dziękuję za odpowiedź. Wprowadziłem logikę do ponownego tworzenia aktywności i fragmentów na podstawie detektorów onSaveInstanceState/onRestoreInstanceState. Wciąż jednak stoję przed kwestią fragmentów "pozostawionych". Ponieważ jest zarejestrowany, aby otrzymać wynik działania, nie zostanie oznaczony jako GC i nie mogę wymyślić dobrego sposobu przekazania tego wyniku do fragmentów, które są ponownie tworzone. –

+0

@DmitryGolomidov Czy znalazłeś odpowiedź? Mam do czynienia z tym samym problemem. – kong