非同期タスクが作業を終了するまで待機します


84

私はプログラミングにとても慣れていないので、疑問があります。

AsyncTaskは私が呼んでいるものを持っていRunInBackGroundます。

そして私はこのプロセスを次のように開始します:

new RunInBackGround().execute();

ただし、他のコードステートメントに進む前に、この呼び出しの実行が完了するまで待ちたいと思います。

どうやってやるの?

そのための方法はありますか?


2
AsyncTaskのポイントは、それが非同期であるということです。つまり、コードの他の部分と同期されていません。
gjordis 2013

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

5
あなたはそれが終わるまで本当に待ちたくありません。あなたが欲しいのはそれがいつ終わるかを知ることです。
njzk2 2013

3
@DcodeChefは、彼が質問で何を望んでいたかを理解した唯一の人です。
please_Dont_Bully_Me_SO_Lords 2014年

1
私は、これはあなたが探している答えだと思う stackoverflow.com/questions/13079645/...
user3362415

回答:


129

この呼び出しが実行を終了するまで待ちます

結果を取得するにはAsyncTask.get()メソッドを呼び出し、doInBackground実行が完了しなくなるまで待機する必要があります。ただし、スレッド内でgetメソッドを呼び出さないと、メインUIスレッドがフリーズします

UIスレッドで結果を取得するには、次のように開始AsyncTaskします。

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

3
では、結果を待ち、メインUIスレッドをロックしないようにする方法は?!コードが結果を待つと言いますが、その間、プログレスバーは回転し続けます!
ムハンマドナデリ2015年

2
@MuhammadNaderi:メソッドAsyncTaskなしgetでAsyncTaskonPostExecuteメソッドを使用すると、メインUIスレッドでuの結果が提供されます
–ρяσѕρєяK 2015

3
確かこれは私が今しばらくの間使用している回避策は、ですが、時々私は次のように、asynctaskのために何かを待つために、コードのために必要awaitc#、そしてもちろんロックメインスレッド得ない
ムハンマド・ナデリ

2
@ρяσѕρєяKありがとう、百万ありがとう。あなたは私がこの問題をどれだけ引っ張ったのか分かりませんが、1つの.get()だけで解決しました(あなたは私をからかっています)1つの.get()だけです!!!!!
code_Worm 2016年

AsyncTaskを使用し、get()を使用してUIがフリーズしないようにするにはどうすればよいですか?
Arjun Issar 2016

37

コードを並列で実行できると便利ですが、アプリの使用フローが待機する必要がある場合でも、UIスレッドをブロックしないように、単にスレッドを使用している場合もあります。

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

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

  2. 何らかの理由でActivity / Fragment / Whateverでそれを実行する必要がある場合は、AsyncTaskからブロードキャストするカスタムリスナーを作成することもできます。これを使用することで、Activity / Fragment / Whateverにコールバックメソッドを含めることができます。これは、必要なときにのみ呼び出されます。つまり、AsyncTaskが待機しなければならなかったもので完了したときです。


6
これは素晴らしい答えであり、受け入れられるべきです。また、AsyncTasksを使用してこれを実現する方法のサンプルもあります:stackoverflow.com/questions/12575068/…–
Jose Gonzalez

2番目のオプションでは、レシーバーにインテントをスローする間に、メインスレッドが正しく再開されます。OPはそれを必要としません。
LincyTonita 2018

16

次のAsyncTaskようなProgressDialogを1つ追加します。

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);

次のonPreExecute()ようなメソッドでSetMessageを実行できます。

this.dialog.setMessage("Processing..."); 
this.dialog.show();

そしてあなたのonPostExecute(Void result)方法であなたを却下しますProgressDialog


15

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.

あなたはonPostExecute()それであなたの仕事を呼び出すことができますdoInBackground()

onPostExecuteは、実装する必要があるものです。


1

最も簡単な方法は、onpostexecuteからデータを取得し、インターフェイスからUiを実行するためのインターフェイスを作成することだと思います。

インターフェースを作成する:

public interface AsyncResponse {
    void processFinish(String output);
}

次にasynctaskで

@Override
protected void onPostExecute(String data) {
    delegate.processFinish(data);
}

その後、あなたの主な活動で

@Override
public void processFinish(String data) {
     // do things

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.