在我接到电话或拨打电话(和其他未记录的中断)后,我的应用程序在恢复活动时会收到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
答案 0 :(得分:2)
查看此图片,了解操作系统将如何以及何时调用您的应用。
答案 1 :(得分:1)
您的应用由于某种原因而被终止,这就是调用onCreate的原因。您应该保存/恢复应用程序状态才能正确处理此问题。请查看this和developers 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);