私はプログラミングにとても慣れていないので、疑問があります。
私AsyncTaskは私が呼んでいるものを持っていRunInBackGroundます。
そして私はこのプロセスを次のように開始します:
new RunInBackGround().execute();
ただし、他のコードステートメントに進む前に、この呼び出しの実行が完了するまで待ちたいと思います。
どうやってやるの?
そのための方法はありますか?
私はプログラミングにとても慣れていないので、疑問があります。
私AsyncTaskは私が呼んでいるものを持っていRunInBackGroundます。
そして私はこのプロセスを次のように開始します:
new RunInBackGround().execute();
ただし、他のコードステートメントに進む前に、この呼び出しの実行が完了するまで待ちたいと思います。
どうやってやるの?
そのための方法はありますか?
回答:
この呼び出しが実行を終了するまで待ちます
結果を取得するにはAsyncTask.get()メソッドを呼び出し、doInBackground実行が完了しなくなるまで待機する必要があります。ただし、スレッド内でgetメソッドを呼び出さないと、メインUIスレッドがフリーズします。
UIスレッドで結果を取得するには、次のように開始AsyncTaskします。
String str_result= new RunInBackGround().execute().get();
AsyncTaskなしgetでAsyncTaskonPostExecuteメソッドを使用すると、メインUIスレッドでuの結果が提供されます
awaitでc#、そしてもちろんロックメインスレッド得ない
コードを並列で実行できると便利ですが、アプリの使用フローが待機する必要がある場合でも、UIスレッドをブロックしないように、単にスレッドを使用している場合もあります。
ここには2つのオプションがあります。
AsyncTask自体で、待機したいコードを実行できます。UI(スレッド)の更新に関係する場合は、onPostExecuteメソッドを使用できます。これは、バックグラウンド作業が完了すると自動的に呼び出されます。
何らかの理由でActivity / Fragment / Whateverでそれを実行する必要がある場合は、AsyncTaskからブロードキャストするカスタムリスナーを作成することもできます。これを使用することで、Activity / Fragment / Whateverにコールバックメソッドを含めることができます。これは、必要なときにのみ呼び出されます。つまり、AsyncTaskが待機しなければならなかったもので完了したときです。
次のAsyncTaskようなProgressDialogを1つ追加します。
private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);
次のonPreExecute()ようなメソッドでSetMessageを実行できます。
this.dialog.setMessage("Processing...");
this.dialog.show();
そしてあなたのonPostExecute(Void result)方法であなたを却下しますProgressDialog。
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は、実装する必要があるものです。
最も簡単な方法は、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
}