How to call Activity method in an AsyncTask

前端 未结 4 794
离开以前
离开以前 2020-12-20 05:24

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

相关标签:
4条回答
  • 2020-12-20 05:25

    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.

    0 讨论(0)
  • 2020-12-20 05:26

    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
         }
    
    } 
    
    0 讨论(0)
  • 2020-12-20 05:31

    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

    0 讨论(0)
  • 2020-12-20 05:49

    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(...);
    
    0 讨论(0)
提交回复
热议问题