Android FragmentManagerImpl.PopbackBackbackImmediate()中的NPE

Android FragmentManagerImpl.PopbackBackbackImmediate()中的NPE,android,Android,当我在手机上快速按back,back,back时,我得到了以下异常: java.lang.NullPointerException at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1378) at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:437) at android.app.

当我在手机上快速按back,back,back时,我得到了以下异常:

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台设备上测试:索尼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
    }

据我所知,问题在于这个调用
返回popBackStackState(mActivity.mHandler,null,-1,0)

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

因此,在我看来,真正的问题是:为什么
mActivity
在该函数(或某个特定于供应商的字段)处为空

根据评论,该问题仅在signle设备上观察到,因此我可以提出以下建议:

  • 验证其他设备上的问题,以检测其是否可复制(因为在android 4.0.4的库存中,
    FragmentManager.java:457
    )没有代码)
  • 尝试为API 15或API 16构建应用程序,并检查问题是否仍然存在
  • 根据回复,问题可能出在
    onDestroy()
    方法之一
  • 调查应用程序代码,以确定是否有部分调用了所有活动的
    finish()
    ,或进行了一些处理以退出应用程序(例如,尝试在退出应用程序时处理多次按压)
  • 尝试锻炼一些技巧(例如,以100毫秒的小延迟处理背部)。但对于这种方式,我建议您确保该问题是特定于供应商的,并检查该黑客行为
当您在设备上快速按2次后退按钮时,
onBackPressed()
方法也被称为2次。这就是问题的根源

解决方案:

查看所有的
onBackPressed()
方法。你有没有因为打了两次电话而引起问题的事情?例如,这可以是对
postdayed()
的调用,这是我的情况。如果是,请添加一个标志,确保您的
onBackPressed()
正文将只执行一次,而不管单击后退按钮的次数:

private boolean backAlreadyPressed = false;

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

    // old implementation of onBackPressed()
}

它是在许多设备上观察到的还是仅在某些特定设备上观察到的?(我在问,因为我已经检查了4.0.4_r1.2和4.0.4_r1.1代码,FragmentManager.java:457中没有代码)我没有任何其他带有4.0.4的设备。事故发生在索尼Xperia MT27i上
FragmentManager
是一个抽象类,代码位于
FragmentManagerImpl
中。您是否添加了一些片段并依赖于片段回退?您是在某个活动的onResume()中执行此操作的吗?它是使用API 7编写的。我没有在代码中使用任何片段或backback。基于此,一些onDestroy()方法可能存在问题。