为了账号安全,请及时绑定邮箱和手机立即绑定

从Android中的AsyncTask返回值

从Android中的AsyncTask返回值

冉冉说 2019-10-25 12:57:25
一个简单的问题:是否可以返回in的值AsyncTask?//AsyncTask is a member classprivate 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 activitymyTask.execute()// something like this?myvalue = myTask.getvalue() 编辑:这是很久以前我不熟悉Java的地方问的,现在我对它有了更好的了解,我将做一个简短的总结:异步任务的要点是该任务为asynchronous,这意味着您调用execute()该任务后,该任务将在其自己的线程上开始运行。从asynctask返回一个值将是没有意义的,因为原始的调用线程已经进行了其他操作(因此该任务是异步的)。想一想时间:在某个时间点,您启动了一个将与主线程并行运行的任务。当并行运行任务完成时,主线程上的时间也已过去。并行任务无法及时返回以将值返回到主线程。我来自C,所以对此我不太了解。但是似乎很多人都在问同样的问题,所以我想我会澄清一下。
查看完整描述

3 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

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


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;

    }

}


查看完整回答
反对 回复 2019-10-25
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-10-25
?
慕慕森

TA贡献1856条经验 获得超17个赞

最简单的方法是将调用对象传递给异步任务(如果愿意,可以构造它):


public class AsyncGetUserImagesTask extends AsyncTask<Void, Void, Void> {


    private MyImagesPagerFragment mimagesPagerFragment;

    private ArrayList<ImageData> mImages = new ArrayList<ImageData>();


    public AsyncGetUserImagesTask(MyImagesPagerFragment imagesPagerFragment) {

        this.mimagesPagerFragment = imagesPagerFragment;

    }


    @Override

    public Void doInBackground(Void... records) {

        // do work here

        return null;

    }


    @Override

    protected void onPostExecute(Void result) {

        mimagesPagerFragment.updateAdapter(mImages);

    }

}

并在调用类(您的活动或片段)中执行任务:


public class MyImagesPagerFragment extends Fragment {

    @Override

    public void onCreate(Bundle savedInstanceState) {

        AsyncGetUserImagesTask mGetImagesTask = new AsyncGetUserImagesTask(this);

        mGetImagesTask.execute();

    }

然后onPostExecuteMethod将在您喜欢的原始类上调用任何方法,例如:


    public void updateAdapter(List<ImageData> images) {

        mImageAdapter.setImages(images);

        mImageAdapter.notifyDataSetChanged();

    }

}


查看完整回答
反对 回复 2019-10-25
  • 3 回答
  • 0 关注
  • 701 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信