2013-02-12 13 views
60

私はプログラミングにとても慣れていて、疑問があります。非同期タスクが完了するまで待機する

AsyncTask私はRunInBackGroundと呼びます。

と私は次のようにこのプロセスを開始します。

new RunInBackGround().execute(); 

しかし、私はこの呼び出しは、コードの他の文に進む前に、その実行を完了するまで待つことを望みます。

どうすればいいですか?

どうすればよいですか?

+0

AsyncTaskのポイントは非同期であることです。これは、コードの残りの部分と同期していないことを意味します。 – Gjordis

+2

AsyncTaskメソッドのonPostExecute()を使用して、クラス内でコールバックを取得できます。 – DcodeChef

+4

あなたは本当にそれが完了するまで待つことを望んでいません。あなたが望むのは、それが終わる時を知ることです。 – njzk2

答えて

97

待機この呼び出しまでそのあなたが戻って結果を取得するためAsyncTask.get()メソッドを呼び出し、doInBackground実行が完了していないまで待つようにする必要があります

の実行を終了します。 スレッド内でgetメソッドを呼び出さないと、メインUIスレッドがフリーズします。あなたのコードは、並列に実行することができる場合に最適、それはいいだろうが、それはあなたが単にそのスレッドを使用している場合することができ

String str_result= new RunInBackGround().execute().get(); 
+1

結果を待つ方法メインのUIスレッドをロックしないでください。 コードが結果を待つが、その間にプログレスバーが回転し続けると言う。 –

+2

@MuhammadNaderi: 'AsyncTask'を' get'メソッドなしで使用し、AsyncTaskの 'onPostExecute'メソッドが呼び出され、メインUIスレッドの結果が返されます –

+1

これは私がしばらく使用していた回避策ですが、時にはasynctaskを待つコードが必要です。 'c#'の 'await'のようなもので、メインスレッドはロックされていません。 –

29

:としてバックUIスレッドで開始AsyncTaskを引き起こす取得するために

あなたのアプリケーションの使用フローがそれを待たなければならない場合でも、あなたはUIスレッドをブロックしません。

ここでは2つのオプションがあります。

  1. 待機するコードは、AsyncTask自体で実行できます。 UI(スレッド)を更新する必要がある場合は、onPostExecuteメソッドを使用できます。これは、あなたのバックグラウンド作業が完了したときに自動的に呼び出されます。

  2. あなたが何らかの理由で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を追加で

+5

これは素晴らしい答えです。 AsyncTasksでこれを達成する方法のサンプルもここにあります:http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is -a –

11

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()であなたの仕事を呼び出すことができますが、実装するために必要なものです。

関連する問題