как передать результат asynctask метод onpostexecute в родительской активности Android - PullRequest
4 голосов
/ 28 марта 2012

Я разрабатываю приложение, в котором мне нужно отправить значение результата метода onPostExecute асинхронной задачи в предыдущее действие, то есть действие, в котором вызывается задача aync. Любая помощь приветствуется

Ответы [ 5 ]

8 голосов
/ 28 марта 2012

Два способа:

  1. Объявление класса, расширяющего AsyncTask, как частного класса в родительском Activity
  2. Pass Handler или сама Activity как параметр расширения класса 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, уже запущен в потоке Activity, следует отметить, что ключевые слова this ведут к MyTask.this, а не MyActivitySubclass.this

2 голосов
/ 28 марта 2012

Хорошо, если ваш 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);
        }

    }

}
1 голос
/ 29 марта 2012

Запустить событие в OnPostExecute.

1 голос
/ 28 марта 2012

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

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

0 голосов
/ 29 мая 2015

Это дополнение к ответу Марека Себеры, он указал на использование обработчика. Чтобы сделать код простым и интуитивно понятным, используйте интерфейс. Это не чуждое понятие, мы все время используем его для функций обратного вызова (например, 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 на нескольких сайтах, мы можем использовать этот тип реализации вместо использования реализации вложенных классов.

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