2

モバイルですばやく戻る、戻る、戻ると、次の例外が発生しました。

java.lang.NullPointerException
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1378)
at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:437)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:452)
at android.app.Activity.onBackPressed(Activity.java:2123)
at com.swipemaster.activities.CommonActivity.onBackPressed(CommonActivity.java:16)
at com.swipemaster.activities.MainActivity.access$0(MainActivity.java:1)
at com.swipemaster.activities.MainActivity$1.run(MainActivity.java:62)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
at dalvik.system.NativeStart.main(Native Method)

Android 4.0.4 および 2 つのデバイスでテスト済み: Sony Xperia MT27i および ST23i。2.2.1 と Galaxy Mini では、この問題は発生しません。誰でも私を助けることができますか?

CommonActivityクラス:

public class CommonActivity extends Activity
{
    @Override
    public void onBackPressed()
    {
        MusicPlayer.continueMusic = true;
        super.onBackPressed(); // this is CommonActivity.java:16
    }
4

2 に答える 2

1

return popBackStackState(mActivity.mHandler, null, -1, 0);私の理解によると、問題は次の関数のこの呼び出しにあります。

 @Override
 public boolean popBackStackImmediate() {
     checkStateLoss();
     executePendingTransactions();
     return popBackStackState(mActivity.mHandler, null, -1, 0);
 }

Android ソースから。

だから、私が見ている本当の質問: なぜmActivityその関数 (またはベンダー固有のフィールド) で null なのですか?

コメントによると、問題は単一のデバイスでのみ観察されたため、次のことを提案できます。

  • 他のデバイスで問題を確認して、再現可能かどうかを確認します (Android 4.0.4 の在庫にはコードがないためFragmentManager.java:457)。
  • API 15 または API 16 用のアプリをビルドしてみて、問題が解決しないかどうかを確認してください。
  • この質問の回答に基づいて、問題はいずれかのonDestroy()方法にある可能性があります。
  • アプリケーション コードを調査して、その一部がfinish()すべてのアクティビティを呼び出しているか、またはアプリを終了するための何らかの処理を行っているかどうかを確認します (たとえば、複数のバック プレスをアプリからの終了として処理しようとします)。
  • いくつかのハックを試してみてください (例: わずか 100 ミリ秒の遅延でバックを処理するなど)。しかし、この方法では、問題がベンダー固有であることを確認し、そのハックをBuild.MANUFACTURERのチェックの下に置くことをお勧めします。
于 2013-03-30T12:15:33.377 に答える
1

デバイスの戻るボタンをすばやく 2 回押すと、onBackPressed() メソッドも 2 回呼び出されます。これが問題の原因です。

解決:

すべての方法を調べてくださいonBackPressed()。2回呼び出されたために問題を引き起こす可能性のあるものはありますか? たとえば、これは への呼び出しである可能性がありますpostDelayed()。これは私のケースでした。onBackPressed()はいの場合は、戻るボタンのクリック回数に関係なく、body が 1 回だけ実行されることを保証するフラグを追加します。

private boolean backAlreadyPressed = false;

@Override
public void onBackPressed()
{
    if (backAlreadyPressed)
    {
        return;
    }
    backAlreadyPressed = true;

    // old implementation of onBackPressed()
}
于 2013-03-30T14:38:53.600 に答える