How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class? How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class? android android

How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?


Easy:

  1. Create interface class, where String output is optional, or can be whatever variables you want to return.

    public interface AsyncResponse {    void processFinish(String output);}
  2. Go to your AsyncTask class, and declare interface AsyncResponse as a field :

    public class MyAsyncTask extends AsyncTask<Void, Void, String> {  public AsyncResponse delegate = null;    @Override    protected void onPostExecute(String result) {      delegate.processFinish(result);    } }
  3. In your main Activity you need to implements interface AsyncResponse.

    public class MainActivity implements AsyncResponse{  MyAsyncTask asyncTask =new MyAsyncTask();  @Override  public void onCreate(Bundle savedInstanceState) {     //this to set delegate/listener back to this class     asyncTask.delegate = this;     //execute the async task      asyncTask.execute();  }  //this override the implemented method from asyncTask  @Override  void processFinish(String output){     //Here you will receive the result fired from async class      //of onPostExecute(result) method.   } }

UPDATE

I didn't know this is such a favourite to many of you. So here's the simple and convenience way to use interface.

still using same interface. FYI, you may combine this into AsyncTask class.

in AsyncTask class :

public class MyAsyncTask extends AsyncTask<Void, Void, String> {  // you may separate this or combined to caller class.  public interface AsyncResponse {        void processFinish(String output);  }  public AsyncResponse delegate = null;    public MyAsyncTask(AsyncResponse delegate){        this.delegate = delegate;    }    @Override    protected void onPostExecute(String result) {      delegate.processFinish(result);    }}

do this in your Activity class

public class MainActivity extends Activity {   MyAsyncTask asyncTask = new MyAsyncTask(new AsyncResponse(){     @Override     void processFinish(String output){     //Here you will receive the result fired from async class      //of onPostExecute(result) method.     }  }).execute(); }

Or, implementing the interface on the Activity again

public class MainActivity extends Activity     implements AsyncResponse{    @Override    public void onCreate(Bundle savedInstanceState) {        //execute the async task         new MyAsyncTask(this).execute();    }    //this override the implemented method from AsyncResponse    @Override    void processFinish(String output){        //Here you will receive the result fired from async class         //of onPostExecute(result) method.    }}

As you can see 2 solutions above, the first and third one, it needs to create method processFinish, the other one, the method is inside the caller parameter. The third is more neat because there is no nested anonymous class. Hope this helps

Tip: Change String output, String response, and String result to different matching types in order to get different objects.


There are a few options:

  • Nest the AsyncTask class within your Activity class. Assuming you don't use the same task in multiple activities, this is the easiest way. All your code stays the same, you just move the existing task class to be a nested class inside your activity's class.

    public class MyActivity extends Activity {    // existing Activity code    ...    private class MyAsyncTask extends AsyncTask<String, Void, String> {        // existing AsyncTask code        ...    }}
  • Create a custom constructor for your AsyncTask that takes a reference to your Activity. You would instantiate the task with something like new MyAsyncTask(this).execute(param1, param2).

    public class MyAsyncTask extends AsyncTask<String, Void, String> {    private Activity activity;    public MyAsyncTask(Activity activity) {        this.activity = activity;    }    // existing AsyncTask code    ...}


I felt the below approach is very easy.

I have declared an interface for callback

public interface AsyncResponse {    void processFinish(Object output);}

Then created asynchronous Task for responding all type of parallel requests

 public class MyAsyncTask extends AsyncTask<Object, Object, Object> {    public AsyncResponse delegate = null;//Call back interface    public MyAsyncTask(AsyncResponse asyncResponse) {        delegate = asyncResponse;//Assigning call back interfacethrough constructor    }    @Override    protected Object doInBackground(Object... params) {      //My Background tasks are written here      return {resutl Object}    }    @Override    protected void onPostExecute(Object result) {        delegate.processFinish(result);    }}

Then Called the asynchronous task when clicking a button in activity Class.

public class MainActivity extends Activity{    @Override    public void onCreate(Bundle savedInstanceState) {    Button mbtnPress = (Button) findViewById(R.id.btnPress);    mbtnPress.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                MyAsyncTask asyncTask =new MyAsyncTask(new AsyncResponse() {                    @Override                    public void processFinish(Object output) {                        Log.d("Response From Asynchronous task:", (String) output);                        mbtnPress.setText((String) output);                   }                });                asyncTask.execute(new Object[] { "Your request to aynchronous task class is giving here.." });            }        });    }}

Thanks