3

電話を受けるか電話をかけた後(およびその他の文書化されていない中断)、アクティビティを再開すると、アプリケーションはNullPointerExceptionを受け取ります。それがどこにあるか、および/またはそれを修正する方法を私に説明できますか?私のアクティビティが再開すると、onCreateが呼び出されているようで、再開後にnullの何かを実行しようとしています。onCreate()が呼び出されないようにするにはどうすればよいですか?

このエラーをデバッグしようとするとデバッガーが切断されるため、呼び出しボタンを押すとアクティビティが終了するようです。

編集:

では、プロセスが強制終了された場合、どのように処理すればよいですか?-> onCreate()?アクティビティA->B->C-> Dがあり、Aまで押し戻します。問題ありません。しかし、別のプログラムを起動したり、別のプログラムが前面に出たりすると、Dがクラッシュし、次にCがクラッシュし、次にBがクラッシュし、次にAがクラッシュします。

編集:

B、C、Dのクラッシュを解決しました。これは、静的変数を格納したクラスがリソースを解放するために破棄され、アクティビティがnull変数を取得していたためです。

しかし、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

この画像をチェックして、OSがアプリを呼び出す方法とタイミングを確認してください。 代替テキスト

于 2010-08-13T17:59:23.843 に答える
1

何らかの理由でアプリが終了するため、onCreateが呼び出されます。これを正しく処理できるようにするには、アプリケーションの状態を保存/再開する必要があります。これ開発者向けリファレンスをご覧ください

于 2010-08-13T19:08:49.730 に答える
1

アプリがメモリを使いすぎている可能性があるため、Android OSは、別のアクティビティを実行するのに十分なメモリを取得するためにアプリを強制終了します。

于 2010-08-13T19:11:32.960 に答える
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番号が割り当てられます。 完全に真実ではありません!編集を参照してください!

編集

コメントに記載されているように、相対レイアウトで作業する場合はIDが必要です。IDが必要な場合は、RelativeLayout.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は、画面上でのレイアウトとはまったく関係ありません。

于 2010-08-14T05:05:27.020 に答える
1

アプリの読み込み中は、もう一度試して、電話やプロセスに参加しないでください。固まるまで待ちます。

于 2012-02-17T06:20:20.540 に答える
0

アクティビティのライフサイクルで使用されるすべての基本機能をオーバーライドしてみませんか。エラーが発生しているlog.vでadblogcatfigureを使用します。アプリがクラッシュする関数のすべての行の後に1つのログを置きます。

また、あなたは何から呼んでいますか?あるエミュレーターから別のエミュレーターに呼び出していますか?そのような場合に存在するlogcatに問題はありませんでした。

于 2010-08-13T18:53:51.550 に答える
0

私は静的変数を持つクラスを使用して呼び出し.getStoredStaticVariable().saveStoredStaticVariable()いましたが、それを取得しようとすると、おそらくクラスがリソースを解放するために破棄されていたため、nullになります。

編集:それは部分的にしか解決策ではありませんでした。の解決策ClassCastException()は変化していました

tempProgress.setId(1);

システムで使用される可能性が低い番号に:

tempProgress.setId(6346346);
于 2010-08-13T20:29:34.160 に答える