![](/img/trans.png)
[英]How can I catch a RuntimeException that is thrown inside a different thread?
[英]How to catch RuntimeException thrown within a Fragment
我的應用程序中嵌入了一個Android Fragment
。 在部署期間,我有某些Android子系統拋出了未記錄的RuntimeException
實例。 煩人,但我想我會把它們放在Fragment
所在的Activity
。 不幸的是,到目前為止,我還沒有取得太大的成就。
我的布局XML如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment android:name="com.my.ui.MyFragment"
android:id="@+id/my_frag"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
為了模擬RuntimeException
,我將其添加到MyFragment.onResume
:
public void onResume() {
super.onResume();
...
throw new RuntimeException("Boom.");
}
為了嘗試在Activity中捕獲它,我認為可能是在布局膨脹過程中發生的,因此我將setContentView
調用包含在try-catch中:
public void onCreate() {
super.onCreate();
try {
setContentView(R.layout.base_layout);
} catch(Exception e) {
Log.e(TAG, e.getMessage());
}
}
編輯后,我寫了這個問題,想嘗試捕捉從super.onResume()的東西MyActivity.onResume
這樣的:
public void onResume() {
try {
super.onResume();
...
} catch(Exception e) {
Log.d(TAG, "I caught something baby!!!");
Log.e(TAG, e.getMessage());
}
}
不幸的是,沒有骰子...似乎Android框架可能在我的Activity可以使用之前就開始使用。 以下是相關的LogCat:
02-06 16:19:36.908: E/AndroidRuntime(29033): FATAL EXCEPTION: main
02-06 16:19:36.908: E/AndroidRuntime(29033): Process: com.my.myactivity, PID: 29033
02-06 16:19:36.908: E/AndroidRuntime(29033): java.lang.RuntimeException: Unable to resume activity {com.my.myactivity/com.my.myactivity.MyActivity}: java.lang.RuntimeException: Boom.
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2788)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2817)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.ActivityThread.access$800(ActivityThread.java:135)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.os.Handler.dispatchMessage(Handler.java:102)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.os.Looper.loop(Looper.java:136)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.ActivityThread.main(ActivityThread.java:5017)
02-06 16:19:36.908: E/AndroidRuntime(29033): at java.lang.reflect.Method.invokeNative(Native Method)
02-06 16:19:36.908: E/AndroidRuntime(29033): at java.lang.reflect.Method.invoke(Method.java:515)
02-06 16:19:36.908: E/AndroidRuntime(29033): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-06 16:19:36.908: E/AndroidRuntime(29033): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-06 16:19:36.908: E/AndroidRuntime(29033): at dalvik.system.NativeStart.main(Native Method)
02-06 16:19:36.908: E/AndroidRuntime(29033): Caused by: java.lang.RuntimeException: Boom.
02-06 16:19:36.908: E/AndroidRuntime(29033): at com.my.ui.MyFragment.onResume(MyFragment.java:97)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.Fragment.performResume(Fragment.java:1743)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:924)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1044)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1863)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.Activity.performResume(Activity.java:5320)
02-06 16:19:36.908: E/AndroidRuntime(29033): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2778)
02-06 16:19:36.908: E/AndroidRuntime(29033): ... 12 more
是否可以捕獲片段在其生命周期階段之一中引發的異常,還是我需要捕獲它並通過Handler
或自定義回調接口發送異常?
誰在調用onResume都可以捕獲此異常。
您不能僅僅用其他不相關的方法來捕獲它。
想想調用堆棧上會發生什么。
僅當調用onCreate導致調用onResume時
(直接或間接),那么您可以在onCreate中捕獲它
只要沒有其他人抓住它。
因此,如果您有以下電話鏈:
some code -> onCreate -> A -> B -> C -> ... -> D -> onResume
和方法D,...,C,B,A沒有捕獲到異常,
那么您可以在onCreate中捕獲它。
我對Android不熟悉,因此可以大致回答。
我嚴重懷疑您在Android中是否有這種聯系方式。
我猜該框架正在分別調用這兩種方法。
我的意思是只看方法名,我猜不是
擁有我上面寫的這個調用鏈是很有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.