【问题标题】:NPE in FragmentManagerImpl.popBackStackImmediate()FragmentManagerImpl.popBackStackImmediate() 中的 NPE
【发布时间】:2013-03-30 22:38:53
【问题描述】:

当我在手机上快速按返回、返回、返回时,出现以下异常:

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.0.4_r1.2 和 4.0.4_r1.1 代码,并且在 FragmentManager.java:457 处没有代码)
  • 我没有其他4.0.4的设备。崩溃发生在 Sony Xperia MT27i 上。 FragmentManager是一个抽象类,代码在FragmentManagerImplgithub.com/grantland/android-support-v4/blob/master/src/java/…
  • 您是在添加一些片段并依赖片段回栈吗?您是否在某些活动的 onResume() 中这样做?
  • 它是使用 API 7 编码的。我的代码中没有使用任何片段,也没有使用 backstack。
  • 基于stackoverflow.com/questions/6774505/…,问题可能出在某些 onDestroy() 方法中。

标签: android


【解决方案1】:

据我了解,问题在于以下函数中的此调用 return popBackStackState(mActivity.mHandler, null, -1, 0);

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

来自Android source

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

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

  • 在其他设备上验证问题以检测它是否可重现(因为在库存 android 4.0.4 中没有代码 FragmentManager.java:457);
  • 尝试为 API 15 或 API 16 构建应用并检查问题是否仍然存在;
  • 根据this question 的回复,问题可能出在onDestroy() 方法之一;
  • 调查应用程序代码以查明它的某些部分是否为所有活动调用 finish() 或执行某些处理以退出应用程序(例如,尝试将多次后按作为退出应用程序处理);
  • 尝试锻炼一些技巧(例如,以 100 毫秒的小延迟处理背部)。但是对于这种方式,我建议您确保问题是特定于供应商的,并将该黑客行为置于Build.MANUFACTURER 的检查之下;

【讨论】:

    【解决方案2】:

    当您快速按设备上的 2 次返回按钮时,onBackPressed() 方法也会被调用 2 次。这就是问题所在。

    解决方案:

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

    private boolean backAlreadyPressed = false;
    
    @Override
    public void onBackPressed()
    {
        if (backAlreadyPressed)
        {
            return;
        }
        backAlreadyPressed = true;
    
        // old implementation of onBackPressed()
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多