Ожидание до завершения асинхронной задачи
Я очень новичок в программировании, и у меня есть некоторые сомнения.
У меня есть AsyncTask
, который я называю RunInBackGround
.
и я начинаю этот процесс следующим образом:
new RunInBackGround().execute();
Но я хочу дождаться завершения этого вызова, прежде чем переходить к другим операторам кода.
Как я могу это сделать?
Есть ли способ для этого?
Ответы
Ответ 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
}