Подтвердить что ты не робот

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

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

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

и я начинаю этот процесс следующим образом:

new RunInBackGround().execute();

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

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

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

4b9b3361

Ответ 1

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

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

Чтобы вернуть результат в поток пользовательского интерфейса start AsyncTask как:

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

Ответ 2

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

У вас здесь много вариантов:

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

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

Ответ 3

В вашем AsyncTask добавить один ProgressDialog, например:

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

вы можете установитьMessage в onPreExecute(), например:

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

и в вашем методе onPostExecute(Void result) отпустите ProgressDialog.

Ответ 4

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 - это то, что вам нужно реализовать.

Ответ 5

Я думаю, что самый простой способ - создать интерфейс для получения данных из onpostexecute и запустить интерфейс из интерфейса:

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

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

Тогда в асинктаске

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

Тогда в вашей основной деятельности

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

}