等待异步任务完成其工作

我对编程还是个新手,我有些疑问。

我有一个 AsyncTask,我称之为 RunInBackGround

然后我开始这个过程:

new RunInBackGround().execute();

但是我希望等到这个调用完成执行之后,再继续执行其他代码语句。

我该怎么做?

有什么办法吗?

210128 次浏览

wait until this call is finish its executing

You will need to call AsyncTask.get() method for getting result back and make wait until doInBackground execution is not complete. but this will freeze Main UI thread if you not call get method inside a Thread.

To get result back in UI Thread start AsyncTask as :

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

Although optimally it would be nice if your code can run parallel, it can be the case you're simply using a thread so you do not block the UI thread, even if your app's usage flow will have to wait for it.

You've got pretty much 2 options here;

  1. You can execute the code you want waiting, in the AsyncTask itself. If it has to do with updating the UI(thread), you can use the onPostExecute method. This gets called automatically when your background work is done.

  2. If you for some reason are forced to do it in the Activity/Fragment/Whatever, you can also just make yourself a custom listener, which you broadcast from your AsyncTask. By using this, you can have a callback method in your Activity/Fragment/Whatever which only gets called when you want it: aka when your AsyncTask is done with whatever you had to wait for.

In your AsyncTask add one ProgressDialog like:

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

you can setMessage in onPreExecute() method like:

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

and in your onPostExecute(Void result) method dismiss your ProgressDialog.

AsyncTask have four methods..

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.

you can call your work on onPostExecute() it calls after returning from doInBackground()

onPostExecute is what you need to Implement.

I think the easiest way is to create an interface to get the data from onpostexecute and run the Ui from interface :

Create an Interface :

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

Then in asynctask

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

Then in yout main activity

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


}