如何将AsyncTask的onPostExecute方法的结果传递到父Activity中的Android

4

我正在开发一个应用程序,在其中需要将asynctask的onPostExecute方法的结果发送到先前的活动中,即调用异步任务的活动。请提供一些代码。任何帮助都将不胜感激。

5个回答

8

有两种方法:

  1. 在父Activity中声明扩展AsyncTask的私有类
  2. 将Handler或Activity本身作为扩展AsyncTask的类的参数传递

如果我是你,我会选择第一种方法。
看看文档

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

如果你的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

1
OP的问题显然是AsyncTask子类在单独文件中声明为公共类。他已经知道onPostExecute的用途。 - Marek Sebera

1
在OnPostExecute中触发一个事件。

0

这是对Marek Sebera的答案的补充,他指出要使用处理程序。为了保持代码简单和直观,请使用接口。这不是陌生的概念,我们经常用于回调函数(例如: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类,我们可以使用这种实现方式,而不是使用嵌套类实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接