3

在我接到电话或拨打电话后(以及其他未记录的中断),我的应用程序在恢复我的活动时会收到 NullPointerException。任何人都可以向我解释它在哪里和/或如何解决它?当我的活动恢复时,它似乎在调用 onCreate,并且它试图在恢复后执行一些为空的东西。如何防止 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
4

7 回答 7

2

查看此图像以了解操作系统将如何以及何时调用您的应用程序。 替代文字

于 2010-08-13T17:59:23.843 回答
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 与它们在屏幕上的布局方式完全无关。

于 2010-08-14T05:05:27.020 回答
1

您可以再试一次,并且在您的应用程序加载时不要接听电话或任何流程。等到定了。

于 2012-02-17T06:20:20.540 回答
1

您的应用程序由于某种原因被终止,这就是调用 onCreate 的原因。您应该保存/恢复应用程序状态才能正确处理此问题。看看这个开发人员参考

于 2010-08-13T19:08:49.730 回答
1

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

于 2010-08-13T19:11:32.960 回答
0

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

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

tempProgress.setId(1);

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

tempProgress.setId(6346346);
于 2010-08-13T20:29:34.160 回答
0

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

还有你打来的电话是什么?你是从一个模拟器打电话到另一个吗?在这种情况下存在的日志猫没有问题。

于 2010-08-13T18:53:51.550 回答