web-dev-qa-db-fra.com

Impossible de reprendre l'activité avec Java.lang.IllegalArgumentException sous Android api> = 24

Il y a un blocage de mon application sur les appareils exécutant la version 7.0, 7.1.1 et 8.0.0 avec le stacktrace suivant:

Fatal Exception: Java.lang.RuntimeException: Unable to resume activity {xxx/xxx.views.activities.HomeActivity}: Java.lang.IllegalArgumentException
   at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:3788)
   at Android.app.ActivityThread.handleResumeActivity(ActivityThread.Java:3828)
   at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2991)
   at Android.app.ActivityThread.-wrap14(ActivityThread.Java)
   at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1635)
   at Android.os.Handler.dispatchMessage(Handler.Java:102)
   at Android.os.Looper.loop(Looper.Java:154)
   at Android.app.ActivityThread.main(ActivityThread.Java:6692)
   at Java.lang.reflect.Method.invoke(Method.Java)
   at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1468)
   at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1358)
Caused by Java.lang.IllegalArgumentException
   at Android.os.Parcel.readException(Parcel.Java:1697)
   at Android.os.Parcel.readException(Parcel.Java:1646)
   at Android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.Java:6600)
   at Android.app.Activity.isTopOfTask(Activity.Java:6142)
   at Android.app.Activity.onResume(Activity.Java:1331)
   at Android.support.v4.app.FragmentActivity.onResume(FragmentActivity.Java:485)
   at xxx.views.activities.BaseActivity.onResume(BaseActivity.Java:50)
   at xxx.views.activities.HomeActivity.onResume(HomeActivity.Java:364)
   at Android.app.Instrumentation.callActivityOnResume(Instrumentation.Java:1277)
   at Android.app.Activity.performResume(Activity.Java:7058)
   at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:3765)
   at Android.app.ActivityThread.handleResumeActivity(ActivityThread.Java:3828)
   at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2991)
   at Android.app.ActivityThread.-wrap14(ActivityThread.Java)
   at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1635)
   at Android.os.Handler.dispatchMessage(Handler.Java:102)
   at Android.os.Looper.loop(Looper.Java:154)
   at Android.app.ActivityThread.main(ActivityThread.Java:6692)
   at Java.lang.reflect.Method.invoke(Method.Java)
   at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1468)
   at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1358)

Mon code sur les lignes rapportées est simplement:

// HomeActivity class
@Override
public void onResume() {
    mPresenter.onResume();
    super.onResume();

    renderView();
}

// BaseActivity class
@Override
protected void onResume() {
    super.onResume();
    // some other code
}

J'ai creusé un peu à ce sujet et trouvé cette question similaire.

Puisque la variable IllegalArgumentException levée ne contient aucun message de détail, je vais essayer de mettre des journaux supplémentaires comme suggéré ici

En attendant, merci d’apprécier toute aide!

41
Jiyeh

J'ai également eu le même problème dans mon projet. Lors de mes recherches, j'ai découvert que cela pourrait également être possible si vous essayez d'accéder à des variables ou méthodes static à partir de la méthode onResume() de votre activité.

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

c'est une exception chaînée alors inspectez e.getCause () stacktrace -> till cause sera null 

si vous ne le trouvez pas, regardez la méthode dans le fil d'activité qui appelle try block:

try { r.activity.onStateNotSaved(); r.activity.mFragments.noteStateNotSaved(); if (r.pendingIntents != null) { deliverNewIntents(r, r.pendingIntents); r.pendingIntents = null; } if (r.pendingResults != null) { deliverResults(r, r.pendingResults); r.pendingResults = null; } r.activity.performResume(); // If there is a pending local relaunch that was requested // when the activity was // paused, it will put the activity into paused state // when it finally happens. // Since the activity resumed before being relaunched, // we don't want that to happen, // so we need to clear the request to relaunch paused. for (int i = mRelaunchingActivities.size() - 1; i >= 0; i--) { final ActivityClientRecord relaunching = mRelaunchingActivities.get(i); if (relaunching.token == r.token && relaunching.onlyLocalRequest && relaunching.startsNotResumed) { relaunching.startsNotResumed = false; } }

vous devez rechercher la raison dans:

  • Activity.onStateNotSaved ();
  • Activity.mFragments.noteStateNotSaved ();
  • Activity.performResume ();
  • et Activity.onNewIntent final ()

Caused by Java.lang.IllegalArgumentException at Android.os.Parcel.readException(Parcel.Java:1697) at Android.os.Parcel.readException(Parcel.Java:1646) at Android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.Java:6600) at Android.app.Activity.isTopOfTask(Activity.Java:6142) at Android.app.Activity.onResume(Activity.Java:1331)

et meilleur coup c'est une réponse à ce problème:

rjava.lang.IllegalArgumentException sur startActivity (intention, animation de bundle)

0
ceph3us

Le problème est avec votre colis. Vous devez rechercher où l'activité, le fragment et la vue enregistrent une parcelle pour enregistrer un état. Il y aura une mauvaise séquence. par exemple. 

@Override
protected Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();

    final CharSequence textFromEditText = mTextView.getText();
    if (textFromEditText != null) {
        SavedState savedState = new SavedState(superState);
        savedState.text = textFromEditText.toString();
        return savedState;
    }
    return superState;
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
    if (!(state instanceof SavedState)) {
        super.onRestoreInstanceState(state);
        return;
    }

    SavedState savedState = (SavedState) state;
    super.onRestoreInstanceState(savedState.getSuperState());
    if (!TextUtils.isEmpty(savedState.text)) {
        mTextView.setText(savedState.text);
    }
}

private static class SavedState extends BaseSavedState {
    String text;

    private SavedState(Parcelable superState) {
        super(superState);
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeString(text);
    }

    private SavedState(Parcel source) {
        super(source);
        text = source.readString();
    }

    public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {

        @Override
        public SavedState createFromParcel(Parcel source) {
            return new SavedState(source);
        }

        @Override
        public SavedState[] newArray(int size) {
            return new SavedState[size];
        }
    };
}

alors le problème pourrait être quelque part dans 

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeString(text);
    }

    private SavedState(Parcel source) {
        super(source);
        text = source.readString();
    }

lorsque la séquence de lecture de la source du colis est mauvaise. 

0