4

私は何日も私を夢中にさせてきたエラーがあります。残念ながら、2つの理由でコードを表示できません。上司はそれを評価せず、コードベースが大きすぎて共有できません。エラーは、アクティビティが終了するたびに発生します。私がfinish()を呼び出したため、またはosがそれを破壊したためです。

問題は、FragmentManagerImplのexecPendingActions()が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]  
4

4 に答える 4

2

アクティビティの終了について話すとき:finish()ビューからアクティビティを実行しようとしていますか?正しく送信していMyClass.this.finish()ますか?

OSがNPEのためにそれを強制的に閉じるように私には見えます。フラグメントに問題があります。それらの間で何かがヌルです。少なくとも、クラッシュする行を貼り付けることができますか?

于 2011-07-23T12:54:31.910 に答える
2

フラグメントマネージャでバグが発生し、破棄される前に保留中のトランザクションのリストがクリアされない可能性があります。これは、FragmentTransaction.commitAllowingStateLoss()を使用して、状態が保存された後にトランザクションをコミットした場合に発生する可能性があります。あなたはあなたの活動でこのコードでそれを回避することができるかもしれません:

@Override void onDestroy() {
    getFragmentManager().executePendingTransactions();
    super.onDestroy();
}
于 2011-07-25T19:33:19.057 に答える
1

compatライブラリを使用して、それをデバッグしてみてください。

または、カットダウンしたサンプルアプリで再現してみてください。

于 2011-07-28T13:08:15.650 に答える
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) {

        } 
} 
于 2015-07-09T09:40:52.803 に答える