当我快速按回,返回,回到我的手机上时,我遇到了以下异常:
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
}
答案 0 :(得分:1)
根据我的理解,问题出在以下函数中的return popBackStackState(mActivity.mHandler, null, -1, 0);
调用中:
@Override
public boolean popBackStackImmediate() {
checkStateLoss();
executePendingTransactions();
return popBackStackState(mActivity.mHandler, null, -1, 0);
}
所以,我认为真正的问题是:为什么mActivity
在该函数(或某些特定于供应商的字段)中为空?
根据评论,该问题仅在signle设备上观察到,因此我可以建议以下内容:
FragmentManager.java:457
没有代码); onDestroy()
方法之一; finish()
还是进行一些处理以退出应用程序(例如,尝试从应用程序退出时尝试处理多次反向操作); 答案 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()
}