Die Aktivität mit java.lang.IllegalArgumentException unter Android api> = 24 kann nicht fortgesetzt werden

72

Es gibt einen Absturz in meiner App auf Geräten, auf denen die Version ausgeführt wird 7.0, 7.1.1und 8.0.0mit dem folgenden Stacktrace:

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)

Mein Code in den gemeldeten Zeilen lautet einfach:

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

    renderView();
}

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

Ich habe ein bisschen darüber gegraben und diese ähnliche Frage gefunden .

Da der IllegalArgumentExceptionWurf keine Detailmeldung enthält, werde ich versuchen, zusätzliche Protokolle einzufügen, wie hier vorgeschlagen .

In der Zwischenzeit freuen wir uns über jede Hilfe!

Jiyeh
quelle
1
Das super.onResume sollte als erstes in Ihrem onResume-Methodenaufruf aufgerufen werden.
JoxTraex
@JoxTraex onResume ist das erste, was in der onResume-Methode verwendet wird. Aber es behebt es nicht. Ich stehe auch in meinem Projekt vor dem gleichen Problem.
Ani
Haben Sie Android L 5.1.x getestet?
JoxTraex
1
Gleiches hier für Android 7 und 8. Haben Sie eine Lösung gefunden?
Zhanbolat Raimbekov
1
Ich habe das gleiche Problem, hat jemand andere Lösungen?
Adriana Carelli

Antworten:

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

Es ist eine verkettete Ausnahme, also überprüfen Sie e.getCause () stacktrace -> bis die Ursache null ist

Wenn Sie es nicht finden, sehen Sie sich die Methode im Aktivitätsthread an, die den try-Block aufruft:

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;
    }
 }
}

Sie müssen nach Gründen suchen in:

  • Activity.onStateNotSaved ();
  • Activity.mFragments.noteStateNotSaved ();
  • Activity.performResume ();
  • und letzte Aktivität.onNewIntent ()
    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)

und am besten Schuss ist es eine Antwort auf dieses Problem:

rjava.lang.IllegalArgumentException on startActivity (Absicht, Bündelanimation)

ceph3us
quelle
-1

Problem ist mit dir Paket. Sie müssen herausfinden, wo Aktivität, Fragment und Ansicht das Paket speichern, um den Status zu speichern. Es wird eine falsche Reihenfolge geben. z.B

@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];
        }
    };
}

Das Problem könnte also irgendwo in sein

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

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

wenn die Reihenfolge des Ablesens der Paketquelle schlecht ist.

Vytautas Berankis
quelle
Das Problem ist mit onResume, nicht mit onRestoreInstanceState
Pnemonic
Ich habe ein ähnliches Problem. Kennen Sie andere Lösungen?
Adriana Carelli
Welche Art von Problem ?
Vytautas Berankis
-1

Ich hatte auch das gleiche Problem in meinem Projekt. Während der Recherche habe ich festgestellt, dass es möglicherweise auch möglich ist, wenn Sie versuchen, über staticdie onResume()Methode Ihrer Aktivität auf Variablen oder Methoden zuzugreifen .

Ajay Mehta
quelle
3
Können Sie bitte erklären, wie der Zugriff auf staticVariablen oder Methoden in onResume()dieses Problem verursachen kann?
Darshna Desai
1
Ich habe klar erwähnt, dass ich während der Recherche diese Lösung gefunden habe. Ich habe auch erwähnt, dass dieses Problem möglicherweise auch möglich ist, wenn Sie versuchen, auf statische Variablen mit der onResume () -Methode zuzugreifen.
Ajay Mehta
Voodoo ist keine Antwort.
NateS