java.lang.RuntimeException: 无法恢复Activity,伴随着java.lang.IllegalArgumentException异常。

67

最近当MainActivity调用onResume()方法时,我有时会遇到这个异常。

java.lang.RuntimeException: Unable to resume activity {com.qau4d.c35s3.androidapp/com.xxx.XXX.XXX.MainActivity}: java.lang.IllegalArgumentException
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3400)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1510)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: java.lang.IllegalArgumentException
at android.os.Parcel.readException(Parcel.java:1687)
at android.os.Parcel.readException(Parcel.java:1636)
at android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.java:5475)
at android.app.Activity.isTopOfTask(Activity.java:5961)
at android.app.Activity.onResume(Activity.java:1252)
at com.qau4d.c35s3.androidapp.onResume(XActivity.java:29)
at com.qau4d.c35s3.androidapp.onResume(MainActivity.java:196)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1269)
at android.app.Activity.performResume(Activity.java:6768)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377)

MainActivity和超类XActivity中, 只有super.onResume();被调用。在长时间的正常开发后出现这个异常确实很奇怪。我查看了一些相关参考资料,但没有找到解决方法。


5
你能分享一些代码吗? - Cochi
2
@Keyson Chous,请在onResume()中发布你正在执行的代码。 - azizbekian
1
你正在使用的Android SDK版本是什么?自从它正常工作以来,你对项目结构(如UI主题)做了哪些更改? - Aram Tchekrekjian
6
用户报告了相同的错误。这只发生在 Android 7.1.1 上。该应用程序是使用 SDK 25 和 AppCompat v7 25.3.0 编译的。 - KoreanDude
8
谷歌问题:https://issuetracker.google.com/issues/66849632 - StepanM
显示剩余11条评论
2个回答

10

在方法Activity#isTopOfTask中,我们可以看到:

private boolean isTopOfTask() {
    if (mToken == null || mWindow == null) {
        return false;
    }
    try {
        return ActivityManager.getService().isTopOfTask(getActivityToken());
    } catch (RemoteException e) {
        return false;
    }
}

在 ActivityManagerService#isTopOfTask 方法中,我们可以找到:

@Override
public boolean isTopOfTask(IBinder token) {
    synchronized (this) {
        ActivityRecord r = ActivityRecord.isInStackLocked(token);
        if (r == null) {
            throw new IllegalArgumentException();
        }
        return r.task.getTopActivity() == r;
    }
}

因此,我认为ActivityRecord为空。但我不知道它为空的原因......


2
这个问题的解决方案是什么? - Girish

5
抱歉,您的问题中缺少足够的信息来确定导致 java.lang.IllegalArgumentException 错误的原因。不幸的是,Android 的 ActivityThread 没有记录该异常的堆栈跟踪信息,并且异常消息似乎为空。
然而,似乎有一种解决方法。在 ActivityThread::performResumeActivity 方法中,以下代码处理该异常:
        } catch (Exception e) {
            if (!mInstrumentation.onException(r.activity, e)) {
                throw new RuntimeException(
                    "Unable to resume activity "
                    + r.intent.getComponent().toShortString()
                    + ": " + e.toString(), e);
            }
        }

如果您为活动注册一个Instrumentation类,应该可以使用onException方法记录因果异常的堆栈跟踪。另一种可能性是使用Thread.setUncaughtExceptionHandler为抛出IllegalArgumentException的线程设置处理程序。这些方法不能解决问题,但可以让您更接近解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接