【问题标题】:How to call Activity method in an AsyncTask如何在 AsyncTask 中调用 Activity 方法
【发布时间】:2013-01-19 22:10:21
【问题描述】:

我想在我的AsyncTaskonPostExecute 之后调用Activity 方法。 你知道我该怎么做吗?

我想在onPostExecute中调用sendSMS(String phoneNumber, String message)方法。

【问题讨论】:

    标签: android android-asynctask android-activity


    【解决方案1】:

    一种方法是通过PostTask 构造函数传递Activity 的实例,类似于:

    private class PostTask extends AsyncTask<String, Integer, String>
    {
        private AsyncBigCalculActivity activity;
    
        public PostTask(AsyncBigCalculActivity activity)
        {
            this.activity = activity;
        }
    
        // ...
    }
    

    在创建PostTask 实例时,传递活动实例:

    new PostTask(this).execute();
    

    现在您可以在PostTask 中调用sendSMS(),例如:

    activty.sendSMS(...);
    

    还请注意,如果您将PostTask 定义为活动内部的私有类,那么您可以调用sendSMS(),例如:

    AsyncBigCalculActivity.this.sendSMS(...);
    

    【讨论】:

      【解决方案2】:

      像这样向你的 AsyncTask 添加一个构造函数和一个全局变量:

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

      然后在需要时只需使用mActivity.sendSMS("test", "test")

      但是,您确实应该在实用程序类中拥有像 sendSMS() 这样的方法。

      【讨论】:

        【解决方案3】:

        如果您的AsyncTask 是您的Activity 的内部类,那么您应该能够从您的onPostExecute() 调用Activity 方法。否则,您可以将Context 发送给AsyncTask 的构造函数并使用它来调用方法

        【讨论】:

          【解决方案4】:

          写一个回调

          您可以使用接口创建回调。这样您就可以在任何活动中使用您的AsyncTask。 (松耦合代码)

          1) 创建回调

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

          2) 在 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) 在您的 Activity 中实现回调并覆盖 doStuff() 方法

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

          【讨论】:

          • 您能否帮助了解如何在以下调用中调用 Activity 方法。当我尝试调用方法时,它无法识别它。我在 Activity 中有回调 new MyTask(new MyAsyncTaskCallBack(){ @Override public void doStuff(String result){ //做一些事情 this.activitymethod() // 虽然它在 Activity 内部调用,但它不识别这个活动方法. } }, this.getApplication().getBaseContext()).execute(params);
          • 在你的活动中像这样创建 MyTask。 --> new MyTask(this).execute(params) @Mr.Jay
          猜你喜欢
          • 1970-01-01
          • 2020-05-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-29
          • 1970-01-01
          • 2021-06-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多