64 votes

java.lang.RuntimeException: impossible de reprendre l'activité avec java.lang.IllegalArgumentException

Récemment, j'ai parfois cette exception quand MainActivity a appelé 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)
 

Les deux en MainActivity et super classe XActivity , seulement super.onResume(); . C'est vraiment étrange d'obtenir cette exception après un développement normal de longue date. J'ai vérifié certains documents de référence, mais rien ne s'est passé.

10voto

MoMo Li Points 59

Dans la méthode Activity # isTopOfTask, nous pouvons voir:

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

Et dans ActivityManagerService # isTopOfTask, nous pouvons trouver:

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

Donc, je pense que ActivityRecord est nul.Mais je ne sais pas pourquoi il est nul ....

5voto

Stephen C Points 255558

Il manque des informations dans votre question, afin de déterminer la cause de l' java.lang.IllegalArgumentException,, Malheureusement, l'androïde ActivityThread n'a pas le journal de la stacktrace de cette exception, et le message de l'exception semble être vide.

Cependant, il semble qu'il y est un moyen d'avancer. L'exception est gérée par le code suivant dans l' ActivityThread::performResumeActivity méthode:

        } catch (Exception e) {
            if (!mInstrumentation.onException(r.activity, e)) {
                throw new RuntimeException(
                    "Unable to resume activity "
                    + r.intent.getComponent().toShortString()
                    + ": " + e.toString(), e);
            }
        }

Si vous vous inscrivez à un Instrumentation classe pour votre activité, il devrait être possible d'utiliser un onException méthode pour ouvrir une session le stacktrace de la causalité exception. Une autre possibilité est d'utiliser Thread.setUncaughtExceptionHandler pour définir un gestionnaire pour le thread dans lequel l' IllegalArgumentException est levée.

Ces ne résoudra pas le problème (!) mais il vous permet d'obtenir un pas de plus vers une solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X