【问题标题】:java.lang.RuntimeException: Unable to resume activity with java.lang.IllegalArgumentExceptionjava.lang.RuntimeException:无法使用 java.lang.IllegalArgumentException 恢复活动
【发布时间】:2017-08-03 04:11:27
【问题描述】:

最近我有时在 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(); 。正常开发了很久才出现这个异常,真的很奇怪,查了一些相关的参考资料都没有。

【问题讨论】:

  • 你能分享一些代码吗?
  • @Keyson Cous,把代码贴到onResume()
  • 你使用的android sdk版本是什么?自从它正常工作以来,您对项目结构(如ui主题)做了哪些更改?
  • 从用户那里得到了同样的错误。仅在 Android 7.1.1 上发生。该应用使用 SDK 25、AppCompat v7 25.3.0 编译。

标签: java android


【解决方案1】:

您的问题中没有足够的信息来确定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 的线程设置处理程序。

这些不会解决问题(!),但它会让您更接近解决方案。

【讨论】:

    【解决方案2】:

    在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 为 null。但我不知道为什么它为 null....

    【讨论】:

    • 这个问题有什么解决办法?
    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多