簡體   English   中英

如何捕獲在片段中引發的RuntimeException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM