如何将数据从异步任务传递给调用它的活动?

时间:2015-07-17 10:59:03

标签: android android-asynctask

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

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

7 个答案:

答案 0 :(得分: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);
        }    
    }

}

答案 1 :(得分:0)

在您的活动类

 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() {

     }
 }

你的AsyncTask
AsyncTask <参数,进度,结果>

class Generic_list(ListView):
    template_name = 'django_test/generic_list.html'

    @property
    def model(self):
        return # code that returns the actual model

一个很好的解释是here

答案 2 :(得分:0)

是的,您可以使用处理程序在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 :(得分:0)

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

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

答案 4 :(得分:0)

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

假设你有一个班级

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

答案 5 :(得分:0)

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

定义接口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();
}
 }

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

package 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 :(得分:0)

我会在MainActivity中创建一个扩展AsyncTask的内部类,并且所有数据都是由getter创建的。