私はプログラミングにとても慣れていて、疑問があります。非同期タスクが完了するまで待機する
AsyncTask
私はRunInBackGround
と呼びます。
と私は次のようにこのプロセスを開始します。
new RunInBackGround().execute();
しかし、私はこの呼び出しは、コードの他の文に進む前に、その実行を完了するまで待つことを望みます。
どうすればいいですか?
どうすればよいですか?
私はプログラミングにとても慣れていて、疑問があります。非同期タスクが完了するまで待機する
AsyncTask
私はRunInBackGround
と呼びます。
と私は次のようにこのプロセスを開始します。
new RunInBackGround().execute();
しかし、私はこの呼び出しは、コードの他の文に進む前に、その実行を完了するまで待つことを望みます。
どうすればいいですか?
どうすればよいですか?
待機この呼び出しまでそのあなたが戻って結果を取得するためAsyncTask.get()メソッドを呼び出し、
doInBackground
実行が完了していないまで待つようにする必要があります
の実行を終了します。 スレッド内でgetメソッドを呼び出さないと、メインUIスレッドがフリーズします。あなたのコードは、並列に実行することができる場合に最適、それはいいだろうが、それはあなたが単にそのスレッドを使用している場合することができ
String str_result= new RunInBackGround().execute().get();
結果を待つ方法メインのUIスレッドをロックしないでください。 コードが結果を待つが、その間にプログレスバーが回転し続けると言う。 –
@MuhammadNaderi: 'AsyncTask'を' get'メソッドなしで使用し、AsyncTaskの 'onPostExecute'メソッドが呼び出され、メインUIスレッドの結果が返されます –
これは私がしばらく使用していた回避策ですが、時にはasynctaskを待つコードが必要です。 'c#'の 'await'のようなもので、メインスレッドはロックされていません。 –
:としてバックUIスレッドで開始AsyncTask
を引き起こす取得するために
あなたのアプリケーションの使用フローがそれを待たなければならない場合でも、あなたはUIスレッドをブロックしません。
ここでは2つのオプションがあります。
待機するコードは、AsyncTask自体で実行できます。 UI(スレッド)を更新する必要がある場合は、onPostExecuteメソッドを使用できます。これは、あなたのバックグラウンド作業が完了したときに自動的に呼び出されます。
あなたが何らかの理由でActivity/Fragment/Whateverでそれを強制するのなら、AsyncTaskからブロードキャストするカスタムリスナーにすることもできます。これを使うことで、Activity/Fragment/Whateverにコールバックメソッドを持たせることができます。コールバックメソッドは、必要なときにのみ呼び出されます。AsyncTaskは、あなたが待たなければならなかったもので終わりです。あなたのようonPreExecute()
方法でsetMessageでき
private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);
:
this.dialog.setMessage("Processing...");
this.dialog.show();
とあなたのonPostExecute(Void result)
方法であなたのProgressDialog
を解任あなたAsyncTask
のような1 ProgressDialogを追加で
これは素晴らしい答えです。 AsyncTasksでこれを達成する方法のサンプルもここにあります:http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is -a –
AsyncTaskには4つのメソッドがあります。
onPreExecute -- for doing something before calling background task in Async
doInBackground -- operation/Task to do in Background
onProgressUpdate -- it is for progress Update
onPostExecute -- this method calls after asyncTask return from doInBackground.
あなたはdoInBackground()
onPostExecuteから戻った後、それが呼び出すonPostExecute()
であなたの仕事を呼び出すことができますが、実装するために必要なものです。
AsyncTaskのポイントは非同期であることです。これは、コードの残りの部分と同期していないことを意味します。 – Gjordis
AsyncTaskメソッドのonPostExecute()を使用して、クラス内でコールバックを取得できます。 – DcodeChef
あなたは本当にそれが完了するまで待つことを望んでいません。あなたが望むのは、それが終わる時を知ることです。 – njzk2