猿问

从Android中的AsyncTask返回值

一个简单的问题:是否可以返回in的值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?

    }

}

然后在我的Activity/ Fragment:


// The task is started from activity

myTask.execute()

// something like this?

myvalue = myTask.getvalue() 

编辑:这是很久以前我不熟悉Java的地方问的,现在我对它有了更好的了解,我将做一个简短的总结:


异步任务的要点是该任务为asynchronous,这意味着您调用execute()该任务后,该任务将在其自己的线程上开始运行。从asynctask返回一个值将是没有意义的,因为原始的调用线程已经进行了其他操作(因此该任务是异步的)。


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


我来自C,所以对此我不太了解。但是似乎很多人都在问同样的问题,所以我想我会澄清一下。


冉冉说
浏览 702回答 3
3回答

GCT1015

为什么不调用处理该值的方法?public class MyClass extends Activity {&nbsp; &nbsp; private class myTask extends AsyncTask<Void, Void, Void> {&nbsp; &nbsp; &nbsp; &nbsp; //initiate vars&nbsp; &nbsp; &nbsp; &nbsp; public myTask() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //my params here&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; protected Void doInBackground(Void... params) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //do stuff&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; protected void onPostExecute(Void result) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //do stuff&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myMethod(myValue);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; private myHandledValueType myMethod(Value myValue) {&nbsp; &nbsp; &nbsp; &nbsp; //handle value&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return myHandledValueType;&nbsp; &nbsp; }}

慕尼黑的夜晚无繁华

那onPostExecute()是为了什么 它在UI线程上运行,您可以将结果从那里传递到屏幕(或其他需要的位置)。在最终结果可用之前,它不会被调用。如果您想获得中间结果,请查看onProgressUpdate()

慕慕森

最简单的方法是将调用对象传递给异步任务(如果愿意,可以构造它):public class AsyncGetUserImagesTask extends AsyncTask<Void, Void, Void> {&nbsp; &nbsp; private MyImagesPagerFragment mimagesPagerFragment;&nbsp; &nbsp; private ArrayList<ImageData> mImages = new ArrayList<ImageData>();&nbsp; &nbsp; public AsyncGetUserImagesTask(MyImagesPagerFragment imagesPagerFragment) {&nbsp; &nbsp; &nbsp; &nbsp; this.mimagesPagerFragment = imagesPagerFragment;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public Void doInBackground(Void... records) {&nbsp; &nbsp; &nbsp; &nbsp; // do work here&nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected void onPostExecute(Void result) {&nbsp; &nbsp; &nbsp; &nbsp; mimagesPagerFragment.updateAdapter(mImages);&nbsp; &nbsp; }}并在调用类(您的活动或片段)中执行任务:public class MyImagesPagerFragment extends Fragment {&nbsp; &nbsp; @Override&nbsp; &nbsp; public void onCreate(Bundle savedInstanceState) {&nbsp; &nbsp; &nbsp; &nbsp; AsyncGetUserImagesTask mGetImagesTask = new AsyncGetUserImagesTask(this);&nbsp; &nbsp; &nbsp; &nbsp; mGetImagesTask.execute();&nbsp; &nbsp; }然后onPostExecuteMethod将在您喜欢的原始类上调用任何方法,例如:&nbsp; &nbsp; public void updateAdapter(List<ImageData> images) {&nbsp; &nbsp; &nbsp; &nbsp; mImageAdapter.setImages(images);&nbsp; &nbsp; &nbsp; &nbsp; mImageAdapter.notifyDataSetChanged();&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Java
Android
我要回答