Я новичок в программировании и сомневаюсь.
У меня есть кот, AsyncTask
который я называю RunInBackGround
.
и я начинаю этот процесс так:
new RunInBackGround().execute();
Но я хочу подождать, пока этот вызов закончит свое выполнение, прежде чем переходить к другим операторам кода.
Как я могу это сделать?
Есть ли способ для этого?
Ответы:
Вам нужно будет вызвать метод AsyncTask.get () для получения результата и подождать, пока
doInBackground
выполнение не будет завершено. но это заморозит основной поток пользовательского интерфейса, если вы не вызовете метод get внутри потока .Чтобы вернуть результат в поток пользовательского интерфейса, запустите
AsyncTask
как:String str_result= new RunInBackGround().execute().get();
источник
AsyncTask
безget
метода и вonPostExecute
методе AsyncTask вызывается, который предоставляет результаты u в основном потоке пользовательского интерфейсаawait
inc#
, и, конечно, не блокировал основной потокХотя оптимально было бы неплохо, если бы ваш код мог работать параллельно, возможно, вы просто используете поток, чтобы не блокировать поток пользовательского интерфейса, даже если потоку использования вашего приложения придется его дождаться.
У вас есть 2 варианта;
Вы можете выполнить ожидаемый код в самой AsyncTask. Если это связано с обновлением пользовательского интерфейса (потока), вы можете использовать метод onPostExecute. Он вызывается автоматически, когда ваша фоновая работа завершена.
Если вы по какой-то причине вынуждены делать это в Activity / Fragment / Whatever, вы также можете просто создать собственный слушатель, который вы транслируете из своей AsyncTask. Используя это, у вас может быть метод обратного вызова в вашем Activity / Fragment / Whatever, который вызывается только тогда, когда вы этого хотите: то есть, когда ваша 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 и запустить 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 }
источник