【发布时间】:2015-07-17 10:59:02
【问题描述】:
我是 Android 新手。我在异步任务中使用套接字,我希望将数据传递回调用它的活动。但我不希望异步任务来处理 UI。我只想传递数据。 e![在此处输入图片描述][1]xtends async task的类不是扩展activity类的一部分
我的活动有 2 个按钮。单击按钮时,将调用异步任务,并对其余活动进行相应的更改。
【问题讨论】:
-
如果您在使用任务的地方发布代码会很有帮助。
我是 Android 新手。我在异步任务中使用套接字,我希望将数据传递回调用它的活动。但我不希望异步任务来处理 UI。我只想传递数据。 e![在此处输入图片描述][1]xtends async task的类不是扩展activity类的一部分
我的活动有 2 个按钮。单击按钮时,将调用异步任务,并对其余活动进行相应的更改。
【问题讨论】:
来自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);
}
}
}
【讨论】:
是的,您可以使用处理程序在 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
【讨论】:
有不同的方式将数据传回活动。如下所述
假设你有一个班级
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
}
}
【讨论】:
在你的活动类中
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
【讨论】:
使用接口实现回调方法的示例。
定义接口,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");
}
}
【讨论】:
那么关于你的答案,实际上你有两种可能性......第一种是@Rodolfoo Perottoni的答案,另一种可能性是正确的,请阅读post!
我更喜欢第二种方式,因为我可以在需要时更新。
【讨论】:
我会在 MainActivity 中创建一个扩展 AsyncTask 的内部类,瞧,getter 已经存在所有数据。
【讨论】: