首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Android中的AsyncTask返回一个值

从Android中的AsyncTask返回一个值
EN

Stack Overflow用户
提问于 2012-02-27 07:19:32
回答 8查看 204.2K关注 0票数 125

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

代码语言:javascript
复制
//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

代码语言:javascript
复制
// The task is started from activity
myTask.execute()
// something like this?
myvalue = myTask.getvalue() 

编辑:这个问题很久以前就被问到了,我对它不太熟悉,现在我对它有了更好的了解,我将做一个简短的总结:

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

考虑时间:在某个时间点,您启动了一个任务,该任务将与主线程并行运行。当并行运行的任务完成时,主线程上也经过了时间。并行任务不能及时返回一个值给主线程。

我是从C语言来的,所以我对此了解不多。但似乎很多人都有同样的问题,所以我想我应该把它弄清楚一点。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-02-27 07:22:45

为什么不调用一个处理这个值的方法呢?

代码语言:javascript
复制
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;
    }
}
票数 38
EN

Stack Overflow用户

发布于 2012-02-27 07:22:31

这就是onPostExecute()的作用。它在UI线程上运行,您可以将结果从那里传递到屏幕上(或需要的任何地方)。直到最终结果可用,它才会被调用。如果您想要交付中间结果,请看一下onProgressUpdate()

票数 46
EN

Stack Overflow用户

发布于 2013-04-02 19:07:08

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

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
public class MyImagesPagerFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        AsyncGetUserImagesTask mGetImagesTask = new AsyncGetUserImagesTask(this);
        mGetImagesTask.execute();
    }

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

代码语言:javascript
复制
    public void updateAdapter(List<ImageData> images) {
        mImageAdapter.setImages(images);
        mImageAdapter.notifyDataSetChanged();
    }
}
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9458258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档