我的应用中嵌入了Android Fragment
。在部署期间,我已经让某些Android子系统抛出了未记录的RuntimeException
个实例。很烦人,但我想我会抓住Activity
住Fragment
。不幸的是,到目前为止我还没有太成功。
我的布局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中捕获它,我想也许它会在布局通胀过程中发生,所以我在try-catch中包围了setContentView
调用:
public void onCreate() {
super.onCreate();
try {
setContentView(R.layout.base_layout);
} catch(Exception e) {
Log.e(TAG, e.getMessage());
}
}
修改
在我写完这个问题之后,想到尝试从MyActivity.onResume
中的super.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
或自定义回调接口发送异常?
答案 0 :(得分:0)
任何调用onResume的人都可以捕获此异常 你不能只用另一个不相关的方法来捕获它。
考虑调用堆栈上发生的事情。
仅当对onCreate的调用导致对onResume的调用时 (直接或间接),然后你可以在onCreate上抓住它 没有其他人抓住它。
所以,如果你有这一系列的电话:
some code -> onCreate -> A -> B -> C -> ... -> D -> onResume
和方法D,...,C,B,A没有捕获异常,
那么你可以在onCreate中捕获它。
我对Android不熟悉,所以回答一下。
我严重怀疑你在Android中有这一系列的通话 我想框架是独立调用这两种方法的 我的意思是只看方法名称,我猜它没有 有意义的是我上面写的这个调用链。