接到电话后,应用程序崩溃了

时间:2010-08-13 17:50:03

标签: android crash android-activity oncreate

在我接到电话或拨打电话(和其他未记录的中断)后,我的应用程序在恢复活动时会收到NullPointerException。可以向我解释它在哪里和/或如何解决它?当我的活动恢复时,它似乎正在调用onCreate,它正在尝试执行Resuming后返回null的内容。如何防止调用onCreate()?

当我按下呼叫按钮时,我的活动似乎终止,因为当我尝试调试此错误时,调试器将断开连接。

编辑:

那么,我该如何处理呢 过程被杀 - > onCreate()?我有活动A - > B - > C - > D,我一直按回A,没有问题。但是,如果我启动另一个程序,或者另一个程序到达前台,D崩溃,然后C崩溃,然后B崩溃,然后A崩溃!

编辑:

我解决了B,C,D崩溃。这是因为我存储静态变量的类被销毁以释放资源,我的活动获得了空变量。

但是当我回到A时,我得到一个classCastException:

08-13 16:52:10.456: ERROR/AndroidRuntime(6048): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bookcessed.booksearch/com.bookcessed.booksearch.activities.ChooseProviderActivity}: java.lang.ClassCastException: android.view.AbsSavedState$1
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.os.Looper.loop(Looper.java:123)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at java.lang.reflect.Method.invokeNative(Native Method)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at java.lang.reflect.Method.invoke(Method.java:521)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at dalvik.system.NativeStart.main(Native Method)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048): Caused by: java.lang.ClassCastException: android.view.AbsSavedState$1
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.widget.ProgressBar.onRestoreInstanceState(ProgressBar.java:944)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.View.dispatchRestoreInstanceState(View.java:6138)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1209)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1209)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.View.restoreHierarchyState(View.java:6117)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1466)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.Activity.onRestoreInstanceState(Activity.java:843)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.Activity.performRestoreInstanceState(Activity.java:815)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1096)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2641)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     ... 11 more

这是我的onCreate():

super.onCreate(savedInstanceState);
        tempLayout = new RelativeLayout(ChooseProviderActivity.this);
        ProgressBar tempProgress = new ProgressBar(ChooseProviderActivity.this);
        tempProgress.setIndeterminate(true);
        tempProgress.setId(1); //I suspect this is the problem
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.CENTER_IN_PARENT);
        tempLayout.addView(tempProgress, lp);
        setContentView(tempLayout);

这就是我认为问题所在:

tempProgress.setId(1); //I suspect this is the problem

7 个答案:

答案 0 :(得分:2)

查看此图片,了解操作系统将如何以及何时调用您的应用。  alt text

答案 1 :(得分:1)

您的应用由于某种原因而被终止,这就是调用onCreate的原因。您应该保存/恢复应用程序状态才能正确处理此问题。请查看thisdevelopers reference

答案 2 :(得分:1)

也许您的应用程序使用了太多内存,因此Android操作系统会将其杀死,以便获得足够的内存来运行其他活动。

答案 3 :(得分:1)

仅供其他人澄清,您不需要将ID分配给您在代码中实例化的视图。所以你的代码应该只用

ProgressBar tempProgress = new ProgressBar(ChooseProviderActivity.this);
tempProgress.setIndeterminate(true);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
tempLayout.addView(tempProgress, lp);
setContentView(tempLayout);

Id主要仅在XML文件中设置ID时,为其分配字符串ID,然后编译R.java,并为每个资源分配一个ID号。 不完全为真!请参阅编辑!

修改

正如评论中提到的superjos,在使用相对布局时,确实需要ID。查看RelativeLayout.LayoutParams.addRule(int,int)上的文档,了解何时需要ID。

结束编辑

喜欢这个......

LinearLayout ll = new LinearLayout(SomeClass.this);
ll.setOrientation(VERTICAL);
TextView tv = new TextView(SomeClass.this);
EditText et = new EditText(SomeClass.this);
ll.add(tv);
ll.add(et);

这将在EditText视图上方有一个textView。在另一种情况下...... 做

ll.add(et);
ll.add(tv);

将EditText放在TextView上面。 ID与它们在屏幕上的布局完全无关。

答案 4 :(得分:1)

您可以再次尝试,并且在加载应用时不要参加通话或任何过程。等到它结束。

答案 5 :(得分:0)

为什么不尝试覆盖活动生命周期中使用的所有基本功能。使用adb logcat计算出你的错误发生的log.v.在应用程序崩溃的函数中的每一行之后放一个日志。

你还要打电话给谁?你是从一个模拟器呼叫到另一个吗?我在这样的实例中存在日志cat没有问题。

答案 6 :(得分:0)

我正在使用一个带有静态变量的类并调用.getStoredStaticVariable().saveStoredStaticVariable(),当我尝试检索它时,它将为null,可能是因为该类被销毁以释放资源。

编辑:这只是部分解决方案。 ClassCastException()的解决方案正在改变

tempProgress.setId(1);

到系统不太可能使用的数字:

tempProgress.setId(6346346);