java.lang.RuntimeException : java.lang.IllegalArgumentException으로 활동을 재개 할 수 없습니다.
최근 MainActivity가 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)
모두 MainActivity
슈퍼 클래스 XActivity
만 super.onResume();
. 오랜 시간의 정상적인 개발 끝에이 예외가 발생하는 것은 정말 이상합니다. 상대 참조 자료를 확인했지만 아무것도 얻지 못했습니다.
Activity # isTopOfTask 메서드에서 다음을 볼 수 있습니다.
private boolean isTopOfTask() {
if (mToken == null || mWindow == null) {
return false;
}
try {
return ActivityManager.getService().isTopOfTask(getActivityToken());
} catch (RemoteException e) {
return false;
}
}
그리고 ActivityManagerService # isTopOfTask에서 다음을 찾을 수 있습니다.
@Override
public boolean isTopOfTask(IBinder token) {
synchronized (this) {
ActivityRecord r = ActivityRecord.isInStackLocked(token);
if (r == null) {
throw new IllegalArgumentException();
}
return r.task.getTopActivity() == r;
}
}
그래서 ActivityRecord가 null이라고 생각하지만 왜 null인지 모르겠습니다 ....
의 원인을 확인하는 데 필요한 정보가 충분 하지 않습니다. java.lang.IllegalArgumentException
안타깝게도 Android ActivityThread
는 해당 예외의 스택 추적을 기록하지 않으며 예외 메시지가 비어있는 것처럼 보입니다.
그러나 앞으로 나아갈 길이있는 것 같습니다. 예외는 ActivityThread::performResumeActivity
메서드 의 다음 코드에 의해 처리됩니다 .
} catch (Exception e) {
if (!mInstrumentation.onException(r.activity, e)) {
throw new RuntimeException(
"Unable to resume activity "
+ r.intent.getComponent().toShortString()
+ ": " + e.toString(), e);
}
}
Instrumentation
활동에 대한 클래스를 등록하는 경우 onException
메서드를 사용 하여 원인 예외에 대한 스택 추적을 기록 할 수 있어야합니다 . 또 다른 가능성 은를 throw Thread.setUncaughtExceptionHandler
하는 스레드에 대한 핸들러를 설정하는 데 사용 하는 것 IllegalArgumentException
입니다.
이것들은 문제 (!)를 해결하지 못하지만 해결책에 한 걸음 더 가까워 질 것입니다.
'program story' 카테고리의 다른 글
int8_t, int_least8_t 및 int_fast8_t의 차이점은 무엇입니까? (0) | 2020.12.27 |
---|---|
C ++ 11의 유니 코드 (0) | 2020.12.26 |
Resharper 대 Coderush-2010 리메이크 (0) | 2020.12.26 |
Google Maps JS API ImageMapType을 다각형에 클리핑 (0) | 2020.12.26 |
Contains ()를 사용할 때 2100 매개 변수 제한 (SQL Server)에 도달 (0) | 2020.12.26 |