0

クライアントがサーバーから質問を取得して回答するためのアプリケーションを構築しています。サーバーに質問がない場合は、新しい画面に移動してメッセージを印刷し、数分後に再試行しAsyncTaskます。サーバーが質問を取得している場合は、質問はありません、応答のヘッダーisFindAQuestion、値のヘッダーを送信します、これは、LogCatに印刷して表示さfalseれるかどうかを確認するためのクライアントのコードですが、新しいアクティビティを開始しても問題が発生しますを使用すると、このアクティビティは機能し続け、例外が表示されます。これは、パラメータを取得して処理しようとするためです。アクティビティの最後に配置しますが、終了しません。falsemessage = falseintentnull pointer exceptiononPostExceutenullfinish()false statement

if (response.getFirstHeader("isFindAQuestion").getValue()
                        .toString().equals("false")) {
                    Log.d("message", "false");
                    Bundle basket = new Bundle();
                    basket.putString("Message", "sorry no enought questions");
                    Intent goToAnswerQuestion = new Intent(AnswerQuestion.this,
                            FinishTime.class);
                    goToAnswerQuestion.putExtras(basket);
                    startActivity(goToAnswerQuestion);
                    finish();

                } 

編集

AsyncTask作業中threadなので、アクティビティが終了しても、そのスレッドは機能し続けますか?もしそうなら、どうすればそのスレッドを停止できますか?

4

1 に答える 1

1

doInBackground は UI スレッドではなく、別のスレッドで実行されます。

onPreExecute() が実行を終了した直後にバックグラウンド スレッドで呼び出されます。このステップは、時間がかかる可能性のあるバックグラウンド計算を実行するために使用されます。

バックグラウンド操作を停止し、UI スレッドでいくつかのアクティビティを実行する場合は、cancel() を呼び出してから、UI スレッドで実行される onCancelled コールバックで必要なものをすべて実行することをお勧めします。

AsyncTask ドキュメントから:

cancel(boolean) を呼び出すことで、いつでもタスクをキャンセルできます。このメソッドを呼び出すと、後続の isCancelled() の呼び出しで true が返されます。このメソッドを呼び出すと、onPostExecute(Object) の代わりに onCancelled(Object) が doInBackground(Object[]) が返された後に呼び出されます。タスクができるだけ早くキャンセルされるようにするには、可能であれば (たとえばループ内で) doInBackground(Object[]) から定期的に isCancelled() の戻り値をチェックする必要があります。

protected void onCancelled (Result result)

cancel(boolean) が呼び出され、doInBackground(Object[]) が終了した後、UI スレッドで実行されます。デフォルトの実装は単に onCancelled() を呼び出し、結果を無視します。独自の実装を作成する場合は、super.onCancelled(result) を呼び出さないでください。

于 2012-07-10T13:51:14.817 に答える