一个简单的问题:是否可以在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()
编辑:这个问题很久以前就被问到了,我对它不太熟悉,现在我对它有了更好的了解,我将做一个简短的总结:
异步任务的要点是该任务是asynchronous
,这意味着在对该任务调用execute()
之后,该任务开始在它自己的线程上运行。从asynctask返回一个值是没有意义的,因为原来的调用线程已经在做其他事情了(因此任务是异步的)。
考虑时间:在某个时间点,您启动了一个任务,该任务将与主线程并行运行。当并行运行的任务完成时,主线程上也经过了时间。并行任务不能及时返回一个值给主线程。
我是从C语言来的,所以我对此了解不多。但似乎很多人都有同样的问题,所以我想我应该把它弄清楚一点。
发布于 2012-02-27 07:22:45
为什么不调用一个处理这个值的方法呢?
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;
}
}
发布于 2012-02-27 07:22:31
这就是onPostExecute()
的作用。它在UI线程上运行,您可以将结果从那里传递到屏幕上(或需要的任何地方)。直到最终结果可用,它才会被调用。如果您想要交付中间结果,请看一下onProgressUpdate()
发布于 2013-04-02 19:07:08
最简单的方法是将调用对象传递到异步任务中(如果愿意,可以在构造它时):
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();
}
}
https://stackoverflow.com/questions/9458258
复制相似问题