web-dev-qa-db-ja.com

Android api> = 24でJava.lang.IllegalArgumentExceptionを使用してアクティビティを再開できません

次のスタックトレースでバージョン7.07.1.1および8.0.0を実行しているデバイスでアプリがクラッシュします。

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)

報告された行の私のコードは単純です:

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

    renderView();
}

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

これについていくつか掘り下げてみたところ、これと似たものが見つかりました question

スローされたIllegalArgumentExceptionには詳細なメッセージが含まれていないため、提案された here のように追加のログを入れてみます。

その間、どんな助けにも感謝してください!

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

それは連鎖例外なので、e.getCause()stacktrace->原因がnullになるまで検査します

見つからない場合は、tryブロックを呼び出すアクティビティスレッドのメソッドを見てください。

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

次の理由で検索する必要があります。

  • Activity.onStateNotSaved();
  • Activity.mFragments.noteStateNotSaved();
  • Activity.performResume();
  • そして最後のActivity.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)

そしてベストショットはこの問題に対する答えです:

startActivity(intent、bundle animantion)でのrjava.lang.IllegalArgumentException

1
ceph3us

私のプロジェクトでも同じ問題がありました。調査中に、アクティビティのonResume()メソッドからstatic変数またはメソッドにアクセスしようとすることも可能であることがわかりました。

0
Ajay Mehta

問題は小包にあります。アクティビティ、フラグメント、ビューが状態を保存するためにパーセルを保存している場所を見つける必要があります。間違ったシーケンスがあります。例えば.

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

ので、問題はどこかにある可能性があります

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

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

パーセルソースの読み取り順序が悪い場合。

0