从 Android 中的 AsyncTask 返回一个值

一个简单的问题:是否可以在 中返回值?AsyncTask

//AsyncTask is a member class
private class MyTask extends AsyncTask<Void, Void, Void>{

    protected Void doInBackground(Void... params) {
         //do stuff
         return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        //do stuff
        //how to return a value to the calling method?
    }
}

然后在我的 /:ActivityFragment

// The task is started from activity
myTask.execute()
// something like this?
myvalue = myTask.getvalue() 

编辑:很久以前有人问过我不熟悉Java的地方,现在我对它更好,我会做一个快速的总结:

异步任务的要点是 任务是 ,这意味着在调用任务后,任务开始在自己的线程上运行。从 asynctask 返回值是毫无意义的,因为原始调用线程已经继续执行其他操作(因此任务是异步的)。asynchronousexecute()

想想时间:在某个时间点,您启动了一个将与主线程并行运行的任务。并行运行任务完成后,主线程上的时间也已过。并行任务无法及时返回以将值返回到主线程。

我来自C,所以我对此知之甚少。但似乎很多人都有同样的问题,所以我想我会把它弄清楚一下。


答案 1

这就是onPostExecute()的用途。它在UI线程上运行,您可以将结果从那里传递到屏幕(或您需要的任何其他位置)。在最终结果可用之前,不会调用它。如果你想提供中间结果,看看 onProgressUpdate()


答案 2

为什么不调用处理该值的方法?

public class MyClass extends Activity {

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

        //initiate vars
        public myTask() {
            super();
            //my params here
        }

        protected Void doInBackground(Void... params) {
            //do stuff
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            //do stuff
            myMethod(myValue);
        }
    }

    private myHandledValueType myMethod(Value myValue) {
        //handle value 
        return myHandledValueType;
    }
}

推荐