アプリは電話を受けた後にクラッシュします
-
28-09-2019 - |
質問
電話を受けたか、電話をかけた後(およびその他の文書化されていない中断)、アクティビティを再開するときにアプリケーションがnullpointerexceptionを取得します。それがどこにあるか、そして/またはそれを修正する方法を私に説明することはできますか?私のアクティビティが再開すると、それはoncreateと呼ばれているように思われ、再開後にヌルの何かを実行しようとしています。 OnCreate()が呼び出されないようにするにはどうすればよいですか?
このエラーをデバッグしようとすると、デバッガーが切断されるため、コールボタンを押すとアクティビティが終了するようです。
編集:
では、プロセスを処理するにはどうすればよいか - > oncreate()?アクティビティA-> b-> c-> dがあり、Aまでずっと押し戻しますが、問題はありません。しかし、別のプログラムを開始したり、別のプログラムが前景に来たり、DクラッシュしてからCがクラッシュし、Bがクラッシュしてからクラッシュします!
編集:
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
解決
他の人の明確化のためだけに、コードにインスタンス化するビューに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が必要です。 IDが必要なときに、lerativeLayout.layoutparams.addrule(int、int)のドキュメントをチェックしてください。
編集を終了します
このような...
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は、画面上にレイアウトされている方法とはまったく関係ありません。
他のヒント
この画像をチェックして、OSがアプリをどのように呼び出すかを確認してください。
たぶんあなたのアプリはあまりにも多くのメモリを使用しているので、Android OSはそれを殺し、別のアクティビティを実行するのに十分なメモリを取得するためです。
もう一度試してみることができ、アプリがロードされている間は電話やプロセスに出席しないでください。それが設定されるまで待ちます。
アクティビティライフサイクル中に使用されるすべての基本機能をオーバーライドしてみませんか。エラーが発生しているlog.vを使用してADB logCatの図を使用します。アプリがクラッシュする関数のすべての行の後に1つのログを配置します。
また、あなたは何から呼んでいますか? 1つのエミュレータからもう1つのエミュレータに電話していますか?私はそのような例で存在する丸太猫に問題を抱えていません。
静的変数と呼び出しのクラスを使用していました .getStoredStaticVariable()
と .saveStoredStaticVariable()
そして、私がそれを取得しようとするとき、それはおそらくクラスが破壊されてリソースを解放するためにヌルになるでしょう。
編集:それは部分的には解決策でした。の解決策 ClassCastException()
変化していました
tempProgress.setId(1);
システムが使用する可能性は低い数に:
tempProgress.setId(6346346);