次のスタックトレースでバージョン7.0
、7.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 のように追加のログを入れてみます。
その間、どんな助けにも感謝してください!
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;
}
}
}
次の理由で検索する必要があります。
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
私のプロジェクトでも同じ問題がありました。調査中に、アクティビティのonResume()
メソッドからstatic
変数またはメソッドにアクセスしようとすることも可能であることがわかりました。
問題は小包にあります。アクティビティ、フラグメント、ビューが状態を保存するためにパーセルを保存している場所を見つける必要があります。間違ったシーケンスがあります。例えば.
@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();
}
パーセルソースの読み取り順序が悪い場合。