2013-02-14 14 views
11

Używam biblioteki wsparcia dla Androida v4, wersja 11 i od czasu do czasu, widzę ślad stosu poniżej; Podejrzewam, że dzieje się tak ze względu na uruchomienie od nowszych wersji, dlatego model, do którego próbuję uzyskać dostęp, jest pusty. W każdym razie, ten ślad sprawił, że zastanawiam się, dlaczego onCreateView jest wywoływany, gdy działanie jest niszczone, i jaki jest najlepszy sposób postępowania z takimi przypadkami?Dlaczego wywoływana jest funkcja DialogFragment.onCreateView podczas niszczenia czynności?

java.lang.NullPointerException 
    at com.example.dialogs.ExampleDialogFragment.onCreateView(ExampleDialogFragment.java:53) 
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 
    at android.support.v4.app.FragmentManagerImpl.dispatchReallyStop(FragmentManager.java:1888) 
    at android.support.v4.app.FragmentActivity.onReallyStop(FragmentActivity.java:787) 
    at android.support.v4.app.FragmentActivity.doReallyStop(FragmentActivity.java:764) 
    at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:322) 
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3642) 
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3673) 
    at android.app.ActivityThread.access$2900(ActivityThread.java:125) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4627) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 

Po katastrofie działalność od tyłu stosu zostanie wznowione, mam sprawdzić, czy model ten jest ważny w działalności onResume(), onStart() i onCreate(Bundle savedInstanceState). Jeśli model nie jest prawidłowy, rozpocznę od niego inną czynność pod numerem FLAG_ACTIVITY_NO_HISTORY, zadzwoń pod numer finish() i return;, np.

@Override 
public void onResume() {   
    Model cm = Application.getModel(); 
    final boolean isModelAvailable = cm != null; 
    if (!isModelAvailable) { 
     Intent restartIntent = IntentUtil.intentForAction(Constants.INTENT_RESTART); 
     restartIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
     startActivity(restartIntent); 
     finish(); 
     super.onResume(); 
     return; 
    } else { 

    } 

po INTENT_RESTART aktywność wykończona reinicjalizacji model to rozpoczyna działalność z flagami FLAG_ACTIVITY_CLEAR_TOP działalność ta zobowiązuje transakcję do fragmentu FirstFragment

Zobacz dziennik z FragmentManager.enableDebugLogging(true);.

05-13 13:24:53.051: V/FragmentManager(7468): Commit: BackStackEntry{40710fa0} 
05-13 13:24:53.111: V/FragmentManager(7468): Commit: BackStackEntry{40771e78} 
05-13 13:24:53.151: V/FragmentManager(7468): Run: BackStackEntry{40710fa0} 
05-13 13:24:53.151: V/FragmentManager(7468): add: RetainFragment{4077d048 app_ImageCache} 
05-13 13:24:53.151: V/FragmentManager(7468): Allocated fragment index RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:24:53.151: V/FragmentManager(7468): moveto CREATED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:24:53.151: V/FragmentManager(7468): moveto ACTIVITY_CREATED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:24:53.151: V/FragmentManager(7468): Run: BackStackEntry{40771e78} 
05-13 13:24:53.151: V/FragmentManager(7468): add: FirstFragment{4077dfa8 id=0x7f04000d} 
05-13 13:24:53.151: V/FragmentManager(7468): Allocated fragment index FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:24:53.151: V/FragmentManager(7468): moveto CREATED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:24:53.151: V/FragmentManager(7468): moveto ACTIVITY_CREATED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:24:53.791: V/FragmentManager(7468): moveto STARTED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:24:53.791: V/FragmentManager(7468): moveto STARTED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:24:53.811: V/FragmentManager(7468): moveto RESUMED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:24:53.811: V/FragmentManager(7468): moveto RESUMED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 

05-13 13:25:58.414: V/FragmentManager(7468): Commit: BackStackEntry{40727530} 
05-13 13:25:58.434: V/FragmentManager(7468): Run: BackStackEntry{4078fe00} 
05-13 13:25:58.434: V/FragmentManager(7468): add: RetainFragment{4076f1b0 app_ImageCache} 
05-13 13:25:58.434: V/FragmentManager(7468): Allocated fragment index RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:25:58.434: V/FragmentManager(7468): moveto CREATED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:25:58.434: V/FragmentManager(7468): moveto ACTIVITY_CREATED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:25:58.434: V/FragmentManager(7468): Run: BackStackEntry{40727530} 
05-13 13:25:58.434: V/FragmentManager(7468): add: SecondFragment{40713c28 id=0x7f04000d} 
05-13 13:25:58.434: V/FragmentManager(7468): Allocated fragment index SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:25:58.434: V/FragmentManager(7468): moveto CREATED: SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:25:58.434: V/FragmentManager(7468): moveto ACTIVITY_CREATED: SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:25:58.545: V/FragmentManager(7468): moveto STARTED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:25:58.545: V/FragmentManager(7468): moveto STARTED: SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:25:58.565: V/FragmentManager(7468): moveto RESUMED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:25:58.565: V/FragmentManager(7468): moveto RESUMED: SecondFragment{40713c28 #1 id=0x7f04000d} 

05-13 13:26:02.338: V/FragmentManager(7468): Saved state of RetainFragment{4077d048 #0 app_ImageCache}: null 
05-13 13:26:02.338: V/FragmentManager(7468): Saved state of FirstFragment{4077dfa8 #1 id=0x7f04000d}: Bundle[{android:view_state=a[email protected]}] 
05-13 13:26:02.338: V/FragmentManager(7468): saveAllState: adding fragment #0: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:26:02.338: V/FragmentManager(7468): saveAllState: adding fragment #1: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:26:02.348: V/FragmentManager(7468): movefrom STARTED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:26:02.348: V/FragmentManager(7468): movefrom STARTED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:26:02.358: V/FragmentManager(7468): movefrom STOPPED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:26:02.358: V/FragmentManager(7468): movefrom STOPPED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:27:15.219: V/FragmentManager(7468): movefrom RESUMED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:27:15.219: V/FragmentManager(7468): movefrom RESUMED: SecondFragment{40713c28 #1 id=0x7f04000d} 

05-13 13:27:15.239: V/FragmentManager(7468): Commit: BackStackEntry{40a8a6d0} 
05-13 13:27:15.259: V/FragmentManager(7468): Commit: BackStackEntry{40a90190} 

05-13 13:27:15.279: V/FragmentManager(7468): Run: BackStackEntry{40a8a6d0} 
05-13 13:27:15.279: V/FragmentManager(7468): add: RetainFragment{40a7fdf0 app_ImageCache} 
05-13 13:27:15.279: V/FragmentManager(7468): Allocated fragment index RetainFragment{40a7fdf0 #0 app_ImageCache} 
05-13 13:27:15.279: V/FragmentManager(7468): moveto CREATED: RetainFragment{40a7fdf0 #0 app_ImageCache} 
05-13 13:27:15.279: V/FragmentManager(7468): moveto ACTIVITY_CREATED: RetainFragment{40a7fdf0 #0 app_ImageCache} 
05-13 13:27:15.279: V/FragmentManager(7468): Run: BackStackEntry{40a90190} 
05-13 13:27:15.279: V/FragmentManager(7468): add: ThirdFragment{406c2308 id=0x7f04000d} 
05-13 13:27:15.279: V/FragmentManager(7468): Allocated fragment index ThirdFragment{406c2308 #1 id=0x7f04000d} 
05-13 13:27:15.289: V/FragmentManager(7468): moveto CREATED: ThirdFragment{406c2308 #1 id=0x7f04000d} 
05-13 13:27:15.289: V/FragmentManager(7468): moveto ACTIVITY_CREATED: ThirdFragment{406c2308 #1 id=0x7f04000d} 
05-13 13:27:15.410: V/FragmentManager(7468): moveto STARTED: RetainFragment{40a7fdf0 #0 app_ImageCache} 
05-13 13:27:15.410: V/FragmentManager(7468): moveto STARTED: ThirdFragment{406c2308 #1 id=0x7f04000d} 
05-13 13:27:15.430: V/FragmentManager(7468): moveto RESUMED: RetainFragment{40a7fdf0 #0 app_ImageCache} 
05-13 13:27:15.430: V/FragmentManager(7468): moveto RESUMED: ThirdFragment{406c2308 #1 id=0x7f04000d} 
05-13 13:27:15.810: V/FragmentManager(7468): Saved state of RetainFragment{4076f1b0 #0 app_ImageCache}: null 
05-13 13:27:15.810: V/FragmentManager(7468): Saved state of SecondFragment{40713c28 #1 id=0x7f04000d}: Bundle[{android:[email protected]}] 
05-13 13:27:15.810: V/FragmentManager(7468): saveAllState: adding fragment #0: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:27:15.810: V/FragmentManager(7468): saveAllState: adding fragment #1: SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:27:15.810: V/FragmentManager(7468): movefrom STARTED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:27:15.810: V/FragmentManager(7468): movefrom STARTED: SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:27:15.820: V/FragmentManager(7468): movefrom STOPPED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:27:15.820: V/FragmentManager(7468): movefrom STOPPED: SecondFragment{40713c28 #1 id=0x7f04000d} 


// Here I'm waiting for a while to make sure Android has enough time to do anything it wants, then I press a button gorse-closing the app 
05-13 13:27:59.783: D/AndroidRuntime(7468): Shutting down VM 


05-13 13:28:14.928: V/FragmentManager(7523): Instantiated fragment RetainFragment{406cde80 #0 app_ImageCache} 
05-13 13:28:14.938: V/FragmentManager(7523): restoreAllState: active #0: RetainFragment{406cde80 #0 app_ImageCache} 
05-13 13:28:14.938: V/FragmentManager(7523): Instantiated fragment FirstFragment{406d8410 #1 id=0x7f04000d} 
05-13 13:28:14.938: V/FragmentManager(7523): restoreAllState: active #1: FirstFragment{406d8410 #1 id=0x7f04000d} 
05-13 13:28:14.938: V/FragmentManager(7523): restoreAllState: added #0: RetainFragment{406cde80 #0 app_ImageCache} 
05-13 13:28:14.938: V/FragmentManager(7523): restoreAllState: added #1: FirstFragment{406d8410 #1 id=0x7f04000d} 
05-13 13:28:14.938: V/FragmentManager(7523): moveto CREATED: RetainFragment{406cde80 #0 app_ImageCache} 
05-13 13:28:14.938: V/FragmentManager(7523): moveto CREATED: FirstFragment{406d8410 #1 id=0x7f04000d} 

05-13 13:28:15.128: V/msm8660.gralloc(7523): PmemUserspaceAllocator::PmemUserspaceAllocator(PmemUserspaceAllocator::Deps&, PmemUserspaceAllocator::Deps::Allocator&, const char*) begin 
05-13 13:28:15.138: V/msm8660.gralloc(7523): PmemUserspaceAllocator::PmemUserspaceAllocator(PmemUserspaceAllocator::Deps&, PmemUserspaceAllocator::Deps::Allocator&, const char*) end 
05-13 13:28:15.138: V/msm8660.gralloc(7523): PmemKernelAllocator::PmemKernelAllocator(PmemKernelAllocator::Deps&) begin 
05-13 13:28:15.138: V/msm8660.gralloc(7523): PmemKernelAllocator::PmemKernelAllocator(PmemKernelAllocator::Deps&) end 

05-13 13:28:15.408: V/FragmentManager(7523): moveto ACTIVITY_CREATED: RetainFragment{406cde80 #0 app_ImageCache} 
05-13 13:28:15.408: V/FragmentManager(7523): moveto ACTIVITY_CREATED: FirstFragment{406d8410 #1 id=0x7f04000d} 

java.lang.RuntimeException: Unable to destroy activity {com.myapp/com.myapp.activity.FirstFragment}: java.lang.NullPointerException 

05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3272) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3299) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread.access$2100(ActivityThread.java:134) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1143) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.os.Looper.loop(Looper.java:152) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread.main(ActivityThread.java:4606) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at java.lang.reflect.Method.invoke(Method.java:491) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at dalvik.system.NativeStart.main(Native Method) 

// see the original question log, it is quite the same 
05-13 13:35:41.824: E/AndroidRuntime(7691): Caused by: java.lang.NullPointerException 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at com.myapp/com.myapp.activity.FirstFragment.onCreateView(FirstFragment.java:41) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentManagerImpl.dispatchReallyStop(FragmentManager.java:1888) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentActivity.onReallyStop(FragmentActivity.java:787) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentActivity.doReallyStop(FragmentActivity.java:764) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:322) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at com.myapp.activity.FragmentsContainerActivity.onDestroy(FragmentsContainerActivity.java:806) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.Activity.performDestroy(Activity.java:4662) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1113) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3255) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  ... 11 more 

Linia # 806 z FragmentsContainerActivity jest super.onDestroy();:

@Override 
public void onDestroy() { 
    try { 
     unregister(receiver); 
    } catch (Exception e) { 
    } 
    super.onDestroy(); 
+0

Czy możesz opublikować swój kod z 'ExampleDialogFragment.onCreateView()'? –

+0

Czy jesteś pewien, że działanie zostało zniszczone? Bardzo możliwe, że system w pewnym momencie wyczyścił model z pamięci, a teraz próbuje przywrócić działanie, gdy użytkownik wróci do niego. – dmon

+0

@dmon Jesteś poprawne, model jest zniszczona, stąd NullPointerException, a ja podejrzewam, że jest odtworzona w pewnym momencie, ale ślad pokazuje przejście od FragmentActivity.onDestroy do Fragment.onCreateView: androida. support.v4.app.FragmentActivity.onDestroy (FragmentActivity.java:322) – WindsurferOak

Odpowiedz

7

Jak prowadzony w code sample here odnosząc się do sposobu onResumepowinieneś:

Zawsze najpierw zadzwonić

metody nadklasy

Znaczenie, powinieneś umieścić swój numer super.onResume(); na samym początku. To musi być problem.

Przy bieżącym kodzie, którego używasz, wprowadzasz zamieszanie w funkcję FragmentActivity, której polecono zatrzymać (tj. finish), a następnie otrzymasz wiadomość od resume. cykl życia, który nie jest "uzasadniony" w cyklu życia działalności. Fragmenty mają na nie bezpośredni wpływ, ponieważ ich cykl życia jest wywoływany z cyklu życia aktywności, a jeśli aktywność została zakończona od wykończenia -> wznowienia to z pewnością może oznaczać, że fragmenty przeszły od wykończenie/zniszczenie -> wznowienie (przejście przez onCreateView).

+0

Zastanawiam się, dlaczego miałeś 3 awanse na mniej więcej to samo, co napisałem 10 godzin wcześniej? napiwki? ;) – Raanan

+1

Domyślam się, że to dlatego, że zaoferowałem wyjaśnienie i oficjalny kod Androida potwierdzający problem? – Sean

+0

Wywołuję metodę super klasy na początku, ale w niektórych urządzeniach po powrocie do fragmentu okna w widoku tworzenia wywołuje zamiast na CV można zaproponować. – RAHULRSANNIDHI

0

proszę zobaczyć this podobne pytanie, który opisuje takie samo zachowanie, że jesteś z widzeniem, ale rozwiązanie prawdopodobnie nie stosuje w swojej walizka. Aby rozwiązać problem, możesz po prostu sprawdzić, czy wszystko, na czym polega Twój kod, znajduje się pod numerem : null.

+0

Jestem zainteresowany tym, dlaczego fragmenty lyfecycle są tak dziwne, że zobaczenie czegoś takiego oznacza dla mnie, że robię coś złego, 'NullPointerException' jest poza zakresem. –

1

Nie widząc kodu, nie możemy Ci pomóc z konkretnym problemem. Po pierwsze, fakt, że jest to DialogFragment, jest nieistotny.

To powiedziawszy, z mojego doświadczenia, FragmentManager.enableDebugLogging() oszczędza na życie, gdy masz problemy z cyklami życia. To na przykład powie Ci, co robi ten ostatni moveToState (tj., Co stwierdza, że ​​porusza się pomiędzy), co może rzucić nieco światła na błąd.

+0

Dzięki za podpowiedź, dodano logi i opis nawigacji oraz kod. –

Powiązane problemy