我无法弄清楚如何从嵌入AsyncTask
的{{1}}中返回对象。现在,如果我尝试将ArrayList
添加到tours.add(tour);
内的列表中,则返回的AsyncTask
始终为空。
如何从return tours;
内部制造出来并将这些对象成功返回到我的MainActivity?
具有ArrayList的类:
AsyncTask
参与我的MainActivity:
public class JsonParser {
List<Tour> tours = new ArrayList<Tour>();
ToursDataSource datasource;
private String LOGTAG;
//Context ctx;
//public JsonParser(Context context){
// ctx = context;
//}
public List<Tour> startJson(Context context) {
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://edmondvarga.com/android_dev/party_alarm/test_j.php",
new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
try {
JSONObject jsonObj = new JSONObject(response);
JSONArray contacts = jsonObj.getJSONArray("users");
for (int i=0; i< contacts.length();i++){
JSONObject json = contacts.getJSONObject(i);
Tour tour = new Tour();
tour.setTitle(json.getString("title"));
//String c = json.getString("content");
Log.i(LOGTAG, "Tour created with id:" +tour.getTitle());
tours.add(tour);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
return tours;
}
}
答案 0 :(得分:-1)
在MainActivity中,您需要等到AsyncCall完成。当你调用client.get时,你产生一个单独的线程来进行网络调用,然后返回空列表。然后在MainActivity中获得空列表。在onSuccess中,一旦完成解析,您可以通过处理程序或本地广播将消息发送回主活动,以通知它列表已更新。
答案 1 :(得分:-1)
你的问题是任务是异步的。系统执行以下操作(我们只是在单个核心上运行以便更好地理解):call startJson
create AsyncTask
,但现在系统仍在startJson
中运行。现在系统还可以,它是启动异步任务的最佳时机,它填满了你的列表。但是你已经退回了。所以解决方案非常简单。在onSuccess
结束时调用另一个方法,该方法处理结果以进行进一步操作。 (或者只是在onSuccess
中进行,因为这已经在主线程上了)
<强> @Edit:强>
public class JsonParser {
List<Tour> tours = new ArrayList<Tour>();
ToursDataSource datasource;
private String LOGTAG;
//Context ctx;
//public JsonParser(Context context){
// ctx = context;
//}
private final MainActivity mCallback;
public JsonParser(MainActivity callback) {
mCallback = callback;
}
public List<Tour> startJson(Context context) {
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://edmondvarga.com/android_dev/party_alarm/test_j.php",
new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
try {
JSONObject jsonObj = new JSONObject(response);
JSONArray contacts = jsonObj.getJSONArray("users");
for (int i=0; i< contacts.length();i++){
JSONObject json = contacts.getJSONObject(i);
Tour tour = new Tour();
tour.setTitle(json.getString("title"));
//String c = json.getString("content");
Log.i(LOGTAG, "Tour created with id:" +tour.getTitle());
tours.add(tour);
}
} catch (JSONException e) {
e.printStackTrace();
}
callback.setResult(tours);
}
});
public class MainActivity....
public void createData() {
JsonParser jp = new JsonParser(this);
List<Tour> tours = jp.startJson(this);
}
public void setResult(List<Tour> tours) {
for(Tour t : tours) {
//....
}
}