Android Can';是否将数组列表从AsyncTask返回到主活动?
我不知道如何从嵌入在Android Can';是否将数组列表从AsyncTask返回到主活动?,android,arraylist,android-asynctask,return,Android,Arraylist,Android Asynctask,Return,我不知道如何从嵌入在ArrayList中的AsyncTask返回对象。现在,如果我尝试添加tours.add(tour)到AsyncTask内的列表中,返回的回程始终为空 如何从AsyncTask内部停止并将这些对象成功返回到MainActivity 具有ArrayList的类: public class JsonParser { List<Tour> tours = new ArrayList<Tour>(); ToursDataSource d
ArrayList
中的AsyncTask
返回对象。现在,如果我尝试添加tours.add(tour)
到AsyncTask
内的列表中,返回的回程代码>始终为空
如何从AsyncTask
内部停止并将这些对象成功返回到MainActivity
具有ArrayList的类:
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;
}
}
公共类JsonParser{
List tours=new ArrayList();
ToursDataSource数据源;
私有字符串日志标签;
//上下文ctx;
//公共JsonParser(上下文){
//ctx=上下文;
//}
公共列表startJson(上下文){
AsyncHttpClient=新的AsyncHttpClient();
client.get(“http://edmondvarga.com/android_dev/party_alarm/test_j.php",
新的AsyncHttpResponseHandler(){
@凌驾
成功时公共无效(字符串响应){
试试{
JSONObject jsonObj=新的JSONObject(响应);
JSONArray contacts=jsonObj.getJSONArray(“用户”);
对于(int i=0;i
参与我的主要活动:
public void createData() {
JsonParser jp = new JsonParser();
List<Tour> tours = jp.startJson(this);
//ToursPullParser parser = new ToursPullParser();
//List<Tour> tours = parser.parseXML(this);
for (Tour tour : tours) {
datasource.create(tour);
}
public void createData(){
JsonParser jp=新的JsonParser();
List tours=jp.startJson(this);
//ToursPullParser=新的ToursPullParser();
//List tours=parser.parseXML(this);
用于(旅游:旅游){
创建(tour);
}
在MainActivity中,您需要等待异步调用完成。当您调用client.get时,您将生成一个单独的线程来执行网络调用,然后返回空列表。然后在MainActivity中,您将获得空列表。在onSuccess中,一旦完成解析,您可以通过处理程序或一个本地广播,通知它列表已更新。您的问题是任务是异步的。系统执行以下操作(如图所示,为了更好地理解,我们正在处理单个内核):callstartjson
create AsyncTask
,但现在系统仍然运行在startJson
中。现在系统运行正常,是启动异步任务的正确时间了,它填充了您的列表。但是您已经返回了异步任务。因此解决方案非常简单。在onSuccess
结束时,调用另一个方法,该方法对结果进行les处理,以便进行进一步操作。(或者只需在onSuccess
中执行此操作,因为此操作已在主线程上)
@编辑:
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) {
//....
}
}
公共类JsonParser{
List tours=new ArrayList();
ToursDataSource数据源;
私有字符串日志标签;
//上下文ctx;
//公共JsonParser(上下文){
//ctx=上下文;
//}
私人最终活动mCallback;
公共JsonParser(MainActivity回调){
mCallback=回调;
}
公共列表startJson(上下文){
AsyncHttpClient=新的AsyncHttpClient();
client.get(“http://edmondvarga.com/android_dev/party_alarm/test_j.php",
新的AsyncHttpResponseHandler(){
@凌驾
成功时公共无效(字符串响应){
试试{
JSONObject jsonObj=新的JSONObject(响应);
JSONArray contacts=jsonObj.getJSONArray(“用户”);
对于(int i=0;i
我已经放置了要在onSuccess()中返回的值(“tours.add(tour);”);但它对返回状态没有影响,因为它在成功时被锁定在内部。即使我在成功时从内部启动另一个方法,它也不会从MainActivity调用,并且我将无法为您的负面评级返回任何内容。但是,您正在调用create Data。这将启动任务,但您不知道任务何时结束sihed。你可以从main活动中为你的JsonParser提供一个对this
的引用,并调用一个方法,如果它完成了。如果这不能解决你的问题,你确定你在tours中有正确的数据吗?我编辑我的帖子是为了将我的解决方案可视化。谢谢,我没有否决你的答案……不管怎样,它是正确的