Return a value from AsyncTask in Android [duplicate] Return a value from AsyncTask in Android [duplicate] android android

Return a value from AsyncTask in Android [duplicate]


That's what onPostExecute() is for. It runs on the UI thread and you can deliver your result from there to the screen (or anywhere else you need). It won't be called until the final result is available. If you want to deliver intermediate results, take a look at onProgressUpdate()


Why not call a method that handles the value?

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;    }}


Easiest way is to pass the calling object into the async task (upon constructing it if you like):

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);    }}

And the in the calling class (your activity or fragment) execute the task:

public class MyImagesPagerFragment extends Fragment {    @Override    public void onCreate(Bundle savedInstanceState) {        AsyncGetUserImagesTask mGetImagesTask = new AsyncGetUserImagesTask(this);        mGetImagesTask.execute();    }

And then the onPostExecuteMethod will call any method on your originating class you like, eg:

    public void updateAdapter(List<ImageData> images) {        mImageAdapter.setImages(images);        mImageAdapter.notifyDataSetChanged();    }}