【问题标题】:How to pass data from an asynchronous task to an activity that called it?如何将数据从异步任务传递到调用它的活动?
【发布时间】:2015-07-17 10:59:02
【问题描述】:

我是 Android 新手。我在异步任务中使用套接字,我希望将数据传递回调用它的活动。但我不希望异步任务来处理 UI。我只想传递数据。 e![在此处输入图片描述][1]xtends async task的类不是扩展activity类的一部分

我的活动有 2 个按钮。单击按钮时,将调用异步任务,并对其余活动进行相应的更改。

【问题讨论】:

  • 如果您在使用任务的地方发布代码会很有帮助。

标签: android android-asynctask


【解决方案1】:

来自How do I send data back from OnPostExecute in an AsyncTask

class YourActivity extends Activity {
   private static final int DIALOG_LOADING = 1;

   public void onCreate(Bundle savedState) {
     setContentView(R.layout.yourlayout);
     new LongRunningTask1().execute(1,2,3);

   } 

   private void onBackgroundTaskDataObtained(List<String> results) {
     //do stuff with the results here..
   }

   private class LongRunningTask extends AsyncTask<Long, Integer, List<String>> {
        @Override
        protected void onPreExecute() {
          //do pre execute stuff
        }

        @Override
        protected List<String> doInBackground(Long... params) {
            List<String> myData = new ArrayList<String>(); 
            for (int i = 0; i < params.length; i++) {
                try {
                    Thread.sleep(params[i] * 1000);
                    myData.add("Some Data" + i);
                } catch(InterruptedException ex) { }                
            }

            return myData;
        }

        @Override
        protected void onPostExecute(List<String> result) {
            YourActivity.this.onBackgroundTaskDataObtained(result);
        }    
    }

}

【讨论】:

  • @palakarora 记得接受答案,然后! :)
【解决方案2】:

是的,您可以使用处理程序在 AsyncTask 和 Activity 之间进行通信,请参见以下示例,这将有所帮助,

@Override
protected void onPostExecute(Object result) {
    super.onPostExecute(result);
        Message message = new Message();
        Bundle bundle = new Bundle();
        bundle.putString("file", pdfPath);
        message.setData(bundle);
        handler.sendMessage(message); // pass handler object from activity
}

将以下代码放入Activity类

Handler handler = new android.os.Handler() {
    @Override
    public void handleMessage(Message msg) {
          String filePath = msg.getData().getString("file"); // You can change this according to your requirement.

    }
};

如果您不了解 Handler 类,请先阅读以下链接,它会对您有所帮助

https://developer.android.com/training/multiple-threads/communicate-ui.html

【讨论】:

  • 如何接收对方的数据
  • 请再次检查答案!
【解决方案3】:

有不同的方式将数据传回活动。如下所述

假设你有一个班级

    public class Socket {
     private Activity activity;
     //create interface
    public interface OnAyscronusCallCompleteListener{
            public void onComplete(/*your data as parameter*/);
    }
    private void setAsyncListener(Activity activity){
        this.activity = activity;
     }
    //rest of your code
    // send back data to activity
    activity.onComplete(/* your data */)
    }
//Now your activity

class YourActivity extends Activity implements  Socket.OnAyscronusCallCompleteListener {

// rest of your activity life cycle methods
onCreate(Bundle onSaved)
{Socket socket = new Socket();
socket.setAsyncListener(this);
}
public void onComplete(/*your data*/){
// perform action on data
}
}

【讨论】:

    【解决方案4】:

    在你的活动类中

    new YourAsyncTask().execute("String1","String2","12");
    

    你的异步任务
    AsyncTask<参数、进度、结果>

     private class YourAsyncTask extends AsyncTask<String, Void, Void > {
         protected Long doInBackground(String... s) {
             String s1 = s[0]; //="String1";
             String s2 = s[1]; //="String2";
             int s1 = Integer.parseInt(s[2]); //=3;
         }
    
         protected void onProgressUpdate(Void... values) {
    
         }
    
         protected void onPostExecute() {
    
         }
     }
    

    一个很好的解释是here

    【讨论】:

      【解决方案5】:

      使用接口实现回调方法的示例。

      定义接口,NewInterface.java。

      package javaapplication1;
      
      public interface NewInterface {
         void callback();
        }
      

      创建一个新类,NewClass.java。它将调用主类中的回调方法。

      package javaapplication1;
      
       public class NewClass {
      
      private NewInterface mainClass;
      
      public NewClass(NewInterface mClass){
          mainClass = mClass;
      }
      
      public void calledFromMain(){
          //Do somthing...
      
          //call back main
          mainClass.callback();
      }
       }
      

      实现接口NewInterface的主类JavaApplication1.java - callback()方法。它将创建并调用 NewClass 对象。然后,NewClass 对象会依次回调它的 callback() 方法。

      包javaapplication1; 公共类 JavaApplication1 实现 NewInterface{

      NewClass newClass;
      
      public static void main(String[] args) {
      
          System.out.println("test...");
      
          JavaApplication1 myApplication = new JavaApplication1();
          myApplication.doSomething();
      
      }
      
      private void doSomething(){
          newClass = new NewClass(this);
          newClass.calledFromMain();
      }
      
      @Override
      public void callback() {
          System.out.println("callback");
      }
      
       }
      

      【讨论】:

        【解决方案6】:

        那么关于你的答案,实际上你有两种可能性......第一种是@Rodolfoo Perottoni的答案,另一种可能性是正确的,请阅读post

        我更喜欢第二种方式,因为我可以在需要时更新。

        【讨论】:

          【解决方案7】:

          我会在 MainActivity 中创建一个扩展 AsyncTask 的内部类,瞧,getter 已经存在所有数据。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-28
            • 1970-01-01
            • 1970-01-01
            • 2023-03-30
            • 1970-01-01
            • 2021-02-17
            相关资源
            最近更新 更多