2012-03-28 3 views
4

Я разрабатываю приложение, в котором мне нужно отправить значение результата метода onPostExecute asynctask в предыдущее действие, то есть активность, в которой задача aync вызывается.pls помещают некоторые коды. Anyhelp ценятсякак передать результат asynctask onpostexecute метода в родительскую активность android

ответ

8

два способов:

  1. Объявите класс, расширяющий AsyncTask в качестве частного класса в родительской деятельности
  2. Pass Handler или самой деятельности как пары класса, простирающихся AsyncTask

Если бы я тебя , Я бы выполнил первый вариант.
Посмотрите на DOCS:

class MyActivitySubclass extends Activity { 

    function runOnPostExecute(){ 
     // whatever 
    } 

    private class MyTask extends AsyncTask<Void, Void, Void> { 

     void doInBackground(Void... params){ 
      // do your background stuff 
     } 

     void onPostExecute(Void... result){ 
      runOnPostExecute(); 
     } 

    } 

} 

Примечание 1

код помещается в тело функции onPostExecute уже работает на активность потока, следует лишь упомянуть, что this ключевых слов приводит к MyTask.this и не MyActivitySubclass.this

1

Метод onPostExecute запускается в основном потоке пользовательского интерфейса, поэтому все, что делается там, уже есть в вызове AsyncTasks.

http://developer.android.com/reference/android/os/AsyncTask.html

+1

Проблема OP, очевидно, подкласс AsyncTask, объявленный как открытый класс в отдельном файле. Он уже знает, что такое 'onPostExecute', используемый для –

2

Хорошо, если ваш AsyncTask является внутренним классом, вы можете просто вызвать метод в своей деятельности от onPostExecute():

public class MyActivity extends Activity { 

    public void someMethod(String someParam) { 
     // do something with string here 
    } 

    public class InnerTask extends AsyncTask<...> { 

     protected void onPostExecute(result) { 
      someMethod(Send parameters); 
     } 

    } 

} 
0

Его добавление к ответу Марека Себеры, он указал на использование обработчика. Чтобы код был прост и интуитивно понятен, используйте интерфейс. Это не чуждое понятие, мы постоянно используем его для функций обратного вызова (например, OnClickListner и т. Д.). Код будет выглядеть примерно так.

public class InnerTask extends AsyncTask<...> 
    { 
     interface ResultHandler 
     { 
      void gotResult(<> result); 
     } 

     private ResultHandler myResult; 

     //constructor 
     public InnerTask(....params...,ResultHandler callback) 
     { 
      ... 
      this.myResult = callback; 
     } 

     protected void onPostExecute(<>result) 
     { 
      ... 
      myResult.gotResult(result); 
     } 

    } 

    public class MyActivity extends Activity implements InnerTask.ResultHandler 
    { 
     @Override 
     protected void onCreate(Bundle savedInstanceState) 
     { 
      //do something 
      //if you want the InnerTask to execute here 
      InnerTask i = new InnerTask(....params...,this); //send 'this' as parameter 
      i.execute(); 
     } 
     @Override 
     public void gotResult(<> result) 
     { 
      //from onPostExecute 
     } 
    } 

Если мы хотим использовать один и тот же класс AsynTask на нескольких сайтах, мы можем использовать этот тип реализации вместо использования вложенной реализации классов.

Смежные вопросы