Ожидание завершения работы асинхронной задачи


Я очень новичок в программировании и у меня есть некоторые сомнения.

у меня есть AsyncTask который я называю как RunInBackGround.

и я начинаю этот процесс, как:

new RunInBackGround().execute();

но я хочу подождать, пока этот вызов не закончит свое выполнение, прежде чем перейти к другим операторам кода.

как я могу это сделать?

есть ли способ для этого?

5 64

5 ответов:

дождитесь завершения выполнения этого вызова

нужно позвонить AsyncTask.получить() метод для получения результата обратно и сделать ждать, пока doInBackground выполнение не завершено. но это заморозит основной поток пользовательского интерфейса, если вы не вызываете метод get внутри потока.

получить результат обратно в UI Thread start AsyncTask как :

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

хотя оптимально было бы, если бы ваш код мог работать параллельно, это может быть так, что вы просто используете поток, поэтому вы не блокируете поток пользовательского интерфейса, даже если поток использования вашего приложения будет ждать его.

У вас есть в значительной степени 2 варианта здесь;

  1. вы можете выполнить код, который вы хотите ждать, в самой AsyncTask. Если это связано с обновлением пользовательского интерфейса(потока), вы можете использовать метод onPostExecute. Это вызывается автоматически, когда ваша фоновая работа выполнена.

  2. Если вы по какой-то причине вынуждены делать это в Activity/Fragment/Whatever, вы также можете просто сделать себе пользовательский слушатель, который вы транслируете из своей AsyncTask. Используя это, вы можете иметь метод обратного вызова в своей активности/фрагменте/все, что вызывается только тогда, когда вы этого хотите: ака, когда ваша AsyncTask выполняется с тем, что вам нужно было ждать.

в своем AsyncTask добавить один ProgressDialog как:

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

вы можете установить сообщение в onPreExecute() методика:

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

и в onPostExecute(Void result) способ уволить своего ProgressDialog.

AsyncTask есть четыре способа..

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 и запустить пользовательский интерфейс из интерфейса:

создать интерфейс :

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

}