Как вернуть значение из async-задачи в android

Я создал асинхронную задачу для вызова моего сервера для получения данных из БД.
Мне нужно обработать результат, полученный от HTTP-сервера.
Из моей деятельности я называю асинхронную задачу во многих местах. Поэтому я не могу использовать переменную-член для доступа к результату. Есть ли способ?

public Result CallServer(String params) { try { new MainAynscTask().execute(params); } catch(Exception ex) { ex.printStackTrace(); } return aResultM;//Need to get back the result } private class MainAynscTask extends AsyncTask<String, Void, Result> { @Override protected Result doInBackground(String... ParamsP) { //calling server codes return aResultL; } @Override protected void onPostExecute(Result result) { super.onPostExecute(result); //how i will pass this result where i called this task? } 

Попробуйте вызвать метод get () AsyncTask после вызова метода execute (). Это работает для меня

http://developer.android.com/reference/android/os/AsyncTask.html#get ()

 public Result CallServer(String params) { try { MainAynscTask task = new MainAynscTask(); task.execute(params); Result aResultM = task.get(); //Add this } catch(Exception ex) { ex.printStackTrace(); } return aResultM;//Need to get back the result } ... ... 

Есть два способа, которые я могу предложить –

  1. onPostExecute(Result) в AsyncTask . См. http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result)

  2. Отправьте трансляцию с результатом в качестве дополнительного.

AsyncTask – это асинхронная задача, поэтому нет смысла возвращать результат вызывающему. Скорее обрабатывайте результат в onPostExecute() например, задавая значение TextView и т. Д. Или отправляйте широковещательную передачу, чтобы какой-то другой слушатель мог обработать результат.

Вот как я обошел это:

1) Создайте класс интерфейса, который определяет подпись для метода для выполнения при завершении:

 public interface AsyncIfc { public void onComplete(); } 

2) Задайте свойство класса AsyncTask для хранения метода делегата:

  public AsyncIfc completionCode; 

3) Запустите делегат из onPostExecute () в AsyncTask:

 completionCode.onComplete(); 

4) Из вашей логики вызова установите свойство delegate анонимным методом:

 task.completionCode = new AsyncIfc() { @Override public void onComplete() { // Any logic you want to happen after execution } }; 

Когда выполняется асинхронная задача, задача выполняет 4 этапа:

  1. OnPreExecute (), вызывается в потоке пользовательского интерфейса перед выполнением задачи. Этот шаг обычно используется для настройки задачи, например, показывая индикатор выполнения в пользовательском интерфейсе.

  2. DoInBackground (Params …), вызывается в фоновом потоке сразу после того, как onPreExecute () завершает выполнение. Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. Параметры асинхронной задачи передаются на этот шаг. Результат вычисления должен быть возвращен этим шагом и будет возвращен на последний шаг. Этот шаг также может использовать publishProgress (Progress …) для публикации одной или нескольких единиц прогресса. Эти значения публикуются в потоке пользовательского интерфейса на этапе onProgressUpdate (Progress …).

  3. OnProgressUpdate (Прогресс …), вызывается в потоке пользовательского интерфейса после вызова publishProgress (Прогресс …). Время выполнения не определено. Этот метод используется для отображения любой формы прогресса в пользовательском интерфейсе, пока фоновое вычисление все еще выполняется. Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.

  4. OnPostExecute (Result), вызывается в потоке пользовательского интерфейса после завершения фонового вычисления. Результат вычисления фона передается на этот шаг в качестве параметра.

Использовать обработчик

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

  Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { String s=(String)msg.obj; tv.setText(s); } }; //result is soap object in this case. protected void onPostExecute(SoapObject result) { pd.dismiss(); if(result != null) { Message msg=new Message(); msg.obj=result.getProperty(0).toString(); mHandler.sendMessage(msg); }