Shuty
Shuty

Reputation: 87

How to call Activity method in an AsyncTask

I would like to call an Activity method after the onPostExecute of my AsyncTask. Do you know how I can do that?

I want to call in the sendSMS(String phoneNumber, String message) method in the onPostExecute.

Upvotes: 1

Views: 7972

Answers (4)

Rohit Singh
Rohit Singh

Reputation: 18222

Write a Callback

You can create a CallBack using an interface. This way you can use your AsyncTask with any activity. (Loosely coupled code)

1) Create a Callback

interface MyAsyncTaskCallBack{
 
   public void doStuff(String arg1,String arg2);

}  

2) Initialize the callback in your AsyncTask

private class MyTask extends AsyncTask<String, Void, Void>
{
     private MyAsyncTaskCallBackactivity callback;

     public MyTask(MyAsyncTaskCallBackactivity callback)
     {
          this.callback = callback;
     }

     //Call callback.doStuff(....phonenum, ....message); in your postExecute

}

3) Implement the Callback in your Activity and override doStuff() method

public YourActivity extends AppCompatActivity implements MyAsyncTaskCallBack{

      // Your Activity code 
      // new MyTask(this).execute("phonenum","msg");    //<--- This is how you run AsyncTask

      private void sendMessage(String num, String msg){

          // send msg logic
      }

     @Override
     public void doStuff(String arg1,String arg2){
         sendMessage(arg1,arg2);  // invoke activity method
     }

} 

Upvotes: 0

Eng.Fouad
Eng.Fouad

Reputation: 117607

One way is to pass an instance of the Activity through PostTask constructor, something like:

private class PostTask extends AsyncTask<String, Integer, String>
{
    private AsyncBigCalculActivity activity;

    public PostTask(AsyncBigCalculActivity activity)
    {
        this.activity = activity;
    }

    // ...
}

and on creating the PostTask instance, pass the activity instance:

new PostTask(this).execute();

Now you can invoke sendSMS() from within PostTask, like:

activty.sendSMS(...);

Also note that if you are defining the PostTask as a private class inside the activty, then you can invoke sendSMS() like:

AsyncBigCalculActivity.this.sendSMS(...);

Upvotes: 4

codeMagic
codeMagic

Reputation: 44571

If your AsyncTask is an inner class of your Activity then you should be able to call the Activity method from your onPostExecute(). Otherwise, you can send the Context to a constructor of your AsyncTask and uses that to call the method

Upvotes: 1

Raghav Sood
Raghav Sood

Reputation: 82563

Add a constructor and a global variable to your AsyncTask like this:

AsyncBigCalculActivity mActivity;

public PostTask(AsyncBigCalculActivity a) {
    mActivity = a;
}

Then simply use mActivity.sendSMS("test", "test") when you need it.

However, you should really have methods like sendSMS() in a utility class.

Upvotes: 1

Related Questions