我有以下问题。 我有一个名为“A”的类,我在其中创建一个列表“List dStruct”。 我在“A”类中修改了这个对象,我想把它传递给一个Activity供进一步使用。
“A”类也扩展了AsyncTask。
在这种情况下,如何将对象传递给Activity?
这是活动代码:
List dStruct; //the object I want to access
btnPlanTrip.setOnClickListener(new OnClickListener() {
tripReq = new TripRequest(MainActivity.this);
tripReq.execute(request);
dStruct=tripReq.dStruct;
String str= dStruct.get(0).name;
}
tripReq = new TripRequest(MainActivity.this);
tripReq.execute(request);
dStruct=tripReq.dStruct;
String str= dStruct.get(0).name;
}
以下是“A”类的代码
public class TripRequest extends AsyncTask {
List dStruct; } protected void onPostExecute(Long result) {
public TripRequest(MainActivity activity) {
this.activity = activity;
dStruct=new ArrayList <DirectionsStruct>();
progressDialog = new ProgressDialog(activity);
code for dStruct
}
答案 0 :(得分:2)
从Android角度来看,任意Java对象并不是真正的第一类构造。
“主”线程通过活动/广播接收器/服务/内容提供商/视图输入您的代码......好吧,您明白了。然后,应用程序代码可以按照自己的意愿控制流,生成新线程,为操作系统发送意图以适当地路由,以及利用其他任意类(如A类)。但是,您的活动必须询问A,A无法告诉您的活动。
话虽这么说,如果你的活动实例化A,并且A在实例方法中创建名为dStruct的List,你可以这样做。
public partial Class A {
public List createDStruct(){
List dStruct = new List()
//Do stuff to dStruct
return dStruct
}
public partial Class MyActivity {
public List retrieveDstruct(){
A a = new A()
return a.createDStruct()
}
}
答案 1 :(得分:2)
我使用Handler解决了这个问题。在我的自定义AsyncTask中,我将一个Handler从一个Activity传递给构造函数。在AsyncTask的onPostExecute
中,我调用Handler.sendMessage并将任何数据发送回Activity。
AsyncTask代码(您的“A”类)
public class MyAsyncTask extends AsyncTask<RestClient, Void, RestResponse> {
Handler handler;
public MyAsyncTask(Handler handler) {
this.handler = handler;
}
@Override
protected RestResponse doInBackground(RestClient... rc) {
// Get data from web service or whatever...
}
@Override
protected void onPostExecute(RestResponse response){
Message msg = Message.obtain();
msg.obj = response;
this.handler.sendMessage(msg);
}
}
在Activity
中声明的处理程序private Handler activityHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// Do something with msg.obj
};
从在Handler中传递给ctor的Activity调用AsyncTask(在你的按钮点击事件处理程序中执行此操作)
MyAsyncTask async = new MyAsyncTask(activityHandler);
async.execute(...);