FragmentManagerImpl.popBackStackImmediate()中的NPE

时间:2013-03-30 11:47:42

标签: android

当我快速按回,返回,回到我的手机上时,我遇到了以下异常:

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
    }

2 个答案:

答案 0 :(得分:1)

根据我的理解,问题出在以下函数中的return popBackStackState(mActivity.mHandler, null, -1, 0);调用中:

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

来自Android source

所以,我认为真正的问题是:为什么mActivity在该函数(或某些特定于供应商的字段)中为空?

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

  • 验证某些其他设备上的问题,以检测它是否可重现(因为在线安卓4.0.4,FragmentManager.java:457没有代码);
  • 尝试为API 15或API 16构建应用,并检查问题是否仍然存在;
  • 根据this question回复,问题可能出在onDestroy()方法之一;
  • 调查应用程序代码,以确定其中某些部分是为所有活动调用finish()还是进行一些处理以退出应用程序(例如,尝试从应用程序退出时尝试处理多次反向操作);
  • 尝试锻炼一些黑客(例如延迟100ms的背部处理)。但是通过这种方式,我建议你确定问题是特定于供应商的,并且检查Build.MANUFACTURER;

答案 1 :(得分:1)

当您在设备上快速按2次后退按钮时,onBackPressed()方法也会被调用2次。这导致了这个问题。

解决方案:

查看所有onBackPressed()方法。因为被叫2次,你有什么东西可以引起问题吗?例如,这可以是对postDelayed()的调用,这是我的情况。如果是,请添加一个标记,确保您的onBackPressed()正文只会被执行一次,尽管点击后退按钮次数:

private boolean backAlreadyPressed = false;

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

    // old implementation of onBackPressed()
}