Как отправить данные обратно из onPostExecute в AsyncTask? - PullRequest
8 голосов
/ 26 февраля 2012

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

Ответы [ 2 ]

16 голосов
/ 26 февраля 2012

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

public interface AsyncListener {
    public void doStuff( MyObject obj );
}

Таким образом, если вы создаете подкласс AsyncTask, легко добавить этого слушателязатем в onPostExecute () вы можете сделать что-то вроде:

protected void onPostExecute( MyObject obj ) {
   asyncListener.doStuff(obj);
}
7 голосов
/ 26 февраля 2012

Это зависит от структуры вашего класса, но если ваш AsyncTask является классом в вашем Activity, то вы можете ссылаться на методы этого действия. В вашем методе onPostExecute вызовите функцию из вашего Activity, которая передает некоторые данные, полученные в AsyncTask, в действие, где вы можете затем использовать его.

Код будет выглядеть так

class YourActivity extends Activity {
   private static final int DIALOG_LOADING = 1;

   public void onCreate(Bundle savedState) {
     setContentView(R.layout.yourlayout);
     showDialog(DIALOG_LOADING);     
     new LongRunningTask1().execute(1,2,3);

   } 

   protected Dialog onCreateDialog(int dialogId) {
     switch(dialogId) {
       case DIALOG_LOADING:
           ProgressDialog pDialog = new ProgressDialog(this);
           pDialog.setTitle("Loading Data");
           pDialog.setMessage("Loading Data, please wait...");
           return pDialog;
        default:
            return super.onCreateDialog(dialogId);
      }      
   }

   private void onBackgroundTaskDataObtained(List<String> results) {
      dismissDialog(DIALOG_LOADING);
     //do stuff with the results here..
   }

   private class LongRunningTask extends AsyncTask<Long, Integer, List<String>> {
        @Override
        protected void onPreExecute() {
          //do pre execute stuff
        }

        @Override
        protected List<String> doInBackground(Long... params) {
            List<String> myData = new ArrayList<String>(); 
            for (int i = 0; i < params.length; i++) {
                try {
                    Thread.sleep(params[i] * 1000);
                    myData.add("Some Data" + i);
                } catch(InterruptedException ex) {
                }                
            }
            return myData;
        }

        @Override
        protected void onPostExecute(List<String> result) {
            YourActivity.this.onBackgroundTaskDataObtained(result);
        }    
    }

}

Таким образом, типичный процесс выглядит следующим образом: установите вид текущей страницы, а затем отобразите диалоговое окно прогресса. Сразу после этого запустите асинхронную задачу (или когда-нибудь, это на самом деле не имеет значения).

После выполнения асинхронной задачи вызовите функцию действия и передайте ей данные. Не используйте общие данные в асинхронной задаче, иначе вы рискуете столкнуться с поточностью. Вместо этого, как только вы закончите с этим, передайте их действию. Если вы хотите постепенно обновлять представление во время работы, вы можете использовать на onProgressUpdate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...