4

我有一個錯誤讓我瘋狂了好幾天。不幸的是,由於兩個原因,我無法向你展示代碼,我的老闆不會理解它,代碼庫太大而無法共享。每當活動結束時都會發生錯誤。天氣是因爲我打電話給finish(),或者因爲os破壞它。爲什麼在完成活動時拋出NPE?

的問題是,什麼是(或可能)原因execPendingActions()在FragmentManagerImpl在1196線

這裏拋出NPE是堆棧跟蹤:

FragmentManagerImpl.execPendingActions() line: 1196 
FragmentManagerImpl$1.run() line: 375 
Handler.handleCallback(Message) line: 587 
Handler.dispatchMessage(Message) line: 92 
Looper.loop() line: 126 
ActivityThread.main(String[]) line: 3997  
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 491 
ZygoteInit$MethodAndArgsCaller.run() line: 841 
ZygoteInit.main(String[]) line: 599 
NativeStart.main(String[]) line: not available [native method] 
+0

我覺得你真的需要發佈一些代碼... – PJL

+0

我不能。只是想到這個問題,'什麼可能導致NPE在1196行FragmentManagerImpl' – Gallal

+0

拋出是爲了每一個活動還是隻是這個?你能至少描述一下代碼在做什麼......? – gregory561

回答

1

您可以嘗試使用compat庫並調試它。

或者嘗試和再現一個減少示例應用程序。

+0

這個答案有幫助。它導致發現在一個片段的onDestroy()中我調用了一個空引用的方法。不幸的是,堆棧跟蹤沒有說清楚。謝謝@PJL! – Gallal

2

在談到完成活動:您是否想要從視圖中獲取finish()的活動?正確發送MyClass.this.finish()

在我看來,操作系統迫使它關閉到期的NPE。碎片有問題。其中有些東西是空的。你能至少粘貼它崩潰的那一行嗎?

+0

該行是'完成();'從活動內。 – Gallal

+0

碎片在應用程序中的20多個位置被操縱,因此我很難向您展示我如何處理可能導致此問題的碎片。 – Gallal

+0

檢查完成活動的方式,檢查是否完成碎片活動,檢查是否正確充氣。 –

2

您可能正在碰到一個片段管理器中的錯誤,它在被銷燬之前未清除待處理事務的列表。如果您在狀態保存後使用FragmentTransaction.commitAllowingStateLoss()提交事務,就會發生這種情況。您可以在您的活動中使用此代碼解決此問題:

@Override void onDestroy() { 
    getFragmentManager().executePendingTransactions(); 
    super.onDestroy(); 
} 
+1

不幸的是,我已經試過這個,但它不起作用。根據文檔,它返回false,這意味着沒有待執行的事務。 – Gallal

0

該NullPointerException異常是由一個事實,即活動的處理程序是從FragmentManager未設置引起的,所以一個「解決方案」,將防止死機如下:

public void onDestroy(){ 
     super.onDestroy(); 
     try { 
      Field mActivityField = getFragmentManager().getClass().getDeclaredField("mActivity"); 
      mActivityField.setAccessible(true); 
      mActivityField.set(getFragmentManager(), this); 

      Field mPendingActionsField = getFragmentManager().getClass().getDeclaredField("mPendingActions"); 
      mPendingActionsField.setAccessible(true); 
      mPendingActionsField.set(getFragmentManager(), null); 


      Field f = Activity.class.getDeclaredField("mHandler"); 
      f.setAccessible(true); 
      Handler handler = (Handler) f.get(this); 
      handler.close(); 
     } catch (Throwable e) { 

     } 
} 
相關問題