Java 循环AsyncTask以获取JSON并作为对象存储在同一列表中

Java 循环AsyncTask以获取JSON并作为对象存储在同一列表中,java,android,json,object,android-asynctask,Java,Android,Json,Object,Android Asynctask,我想以get request“Mini”为例读取并存储所有JSON值(它实际上是一个用户输入变量),最后一个数字是您正在查看的页面。每页最多可容纳50个结果。格式(我必须读取并存储为JSON,这是为了更容易理解) 本exmaple共有8页,共359个结果。我需要遍历所有页面,并将所有JSON值添加到同一个对象列表中 我有阅读一页的代码。我不知道如何使它在所有页面中循环并添加到同一个对象列表中 在acitivity.java onCreate中,我调用AsyncTask String userSe

我想以
get request
“Mini”为例读取并存储所有
JSON
值(它实际上是一个用户输入变量),最后一个数字是您正在查看的页面。每页最多可容纳50个结果。格式(我必须读取并存储为JSON,这是为了更容易理解)

本exmaple共有8页,共359个结果。我需要遍历所有页面,并将所有JSON值添加到同一个对象列表中

我有阅读一页的代码。我不知道如何使它在所有页面中循环并添加到同一个对象列表中

在acitivity.java onCreate中,我调用AsyncTask

String userSearchRequest = search_activity_data.getString("userSearchRequest");
int page = 0;
String spidy_iTN_url = "http://www.gw2spidy.com/api/v0.9/json/item-search/" + userSearchRequest + "/" + page;

itemsByInput_AsyncTask itemsByInput_AsyncTask = new itemsByInput_AsyncTask();
itemsByInput_AsyncTask.setItemListToListings(this);
itemsByInput_AsyncTask.execute(spidy_iTN_url);
这是我的AsyncTask类,名为
itemsbynput\u AsyncTask.java

import constructors.itemResults_api_constr;
import constructors.itemRoot_api_constr;

public class itemsByInput_AsyncTask extends AsyncTask<String, Void, JSONObject> {

        JSONObject Jo_result;
        private itemListToListings itemListToListings;

     public void setItemListToListings (itemListToListings itemListToListings) {
        this.itemListToListings = itemListToListings;
    }

    @Override
    protected JSONObject doInBackground(String... params) {
        return spidyHttpGetRequest(params[0]);
    }

    public JSONObject spidyHttpGetRequest(String URL){
        try {
            HttpGet get = new HttpGet(URL);
            HttpClient client = new DefaultHttpClient();
            HttpResponse response = client.execute(get);
            HttpEntity entity = response.getEntity();
            String result = EntityUtils.toString(entity);
            Jo_result = new JSONObject(result);

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return Jo_result;
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject) {
        super.onPostExecute(jsonObject);
        this.itemListToListings.itemListToListings(JoToJO_constructor(jsonObject));
    }


    public itemRoot_api_constr JoToJO_constructor(JSONObject Jo_result) {
        itemRoot_api_constr spidy_iTN_rootO = new itemRoot_api_constr();

        try {
            spidy_iTN_rootO.setCount(Jo_result.getInt("count"));
            spidy_iTN_rootO.setPage(Jo_result.getInt("page"));
            spidy_iTN_rootO.setLast_page(Jo_result.getInt("last_page"));
            spidy_iTN_rootO.setTotal(Jo_result.getInt("total"));
            JSONArray list = new JSONArray(Jo_result.getString("results"));

            for (int i = 0; i < spidy_iTN_rootO.getCount(); i++) {
                JSONObject resultsObject = list.getJSONObject(i);
                itemResults_api_constr spidy_iTN_resultsO = new itemResults_api_constr();

                spidy_iTN_resultsO.setData_id(resultsObject
                        .getInt("data_id"));
                spidy_iTN_resultsO.setName(resultsObject
                        .getString("name"));
                spidy_iTN_resultsO.setRarity(resultsObject
                        .getInt("rarity"));
                spidy_iTN_resultsO.setRestriction_level(resultsObject
                        .getInt("restriction_level"));
                spidy_iTN_resultsO.setImg(resultsObject
                        .getString("img"));
                spidy_iTN_resultsO.setType_id(resultsObject
                        .getInt("type_id"));
                spidy_iTN_resultsO.setSub_type_id(resultsObject
                        .getInt("sub_type_id"));
                spidy_iTN_resultsO.setPrice_last_changed(resultsObject
                        .getString("price_last_changed"));
                spidy_iTN_resultsO.setMax_offer_unit_price(resultsObject
                        .getInt("max_offer_unit_price"));
                spidy_iTN_resultsO.setMin_sale_unit_price(resultsObject
                        .getInt("min_sale_unit_price"));
                spidy_iTN_resultsO.setOffer_availability(resultsObject
                        .getInt("offer_availability"));
                spidy_iTN_resultsO.setSale_availability(resultsObject
                        .getInt("sale_availability"));
                spidy_iTN_resultsO.setSale_price_change_last_hour(resultsObject
                        .getInt("sale_price_change_last_hour"));
                spidy_iTN_resultsO.setOffer_price_change_last_hour(resultsObject
                        .getInt("offer_price_change_last_hour"));
                spidy_iTN_rootO.addObject(spidy_iTN_resultsO);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        return spidy_iTN_rootO;
    }

    public interface itemListToListings {
        public void itemListToListings(itemRoot_api_constr resultClass);
    }


}
编辑3:错误日志

05-01 07:17:39.828    3620-3620/com.example.krijn.gw2TP_androidMobile E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.krijn.gw2TP_androidMobile, PID: 3620
    java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.krijn.gw2TP_androidMobile.AsyncTasks.itemsByInput_AsyncTask$itemListToListings.itemListToListings(com.example.krijn.gw2TP_androidMobile.constructors.itemRoot_api_constr)' on a null object reference
            at com.example.krijn.gw2TP_androidMobile.AsyncTasks.itemsByInput_AsyncTask.onProgressUpdate(itemsByInput_AsyncTask.java:88)
            at com.example.krijn.gw2TP_androidMobile.AsyncTasks.itemsByInput_AsyncTask.onProgressUpdate(itemsByInput_AsyncTask.java:27)
在Logcat中出现此错误后,我仍然可以在
doInBackground

for (int n = 1; n < nPage; n++){
            Log.i("gw2Log", "n: " + n);
            publishProgress(JoToJO_constructor(spidyHttpGetRequest(makeUrl(n))));
        }
for(int n=1;n

完成后,循环应用程序崩溃。

我认为您希望根据从第一页获得的
最后一页
属性进行链式调用。我会这样做,每次完成请求后,UI都会在
onProgressUpdate

public class itemsByInput_AsyncTask extends AsyncTask<Void, itemRoot_api_constr, Void> {

 JSONObject Jo_result;
 private itemListToListings itemListToListings;
 String userSearchRequest;

 public itemsByInput_AsyncTask(String userSearchRequest){
  this.userSearchRequest = userSearchRequest;
 } 

 private String makeUrl(int page){
    return "http://www.gw2spidy.com/api/v0.9/json/item-search/" + 
           this.userSearchRequest + "/" + page;
 }

 @Override
 protected Void doInBackground(Void... params) {
    itemRoot_api_constr iac;

    iac = JoToJO_constructor(spidyHttpGetRequest(makeUrl(0)));
    nPage = iac.getLast_page();
    publishProgress(iac);

    for (int n = 1; n<nPage; n++){
         publishProgress(spidyHttpGetRequest(makeUrl(n)));
    }
    return null;
 }

 @Override
 protected void onProgressUpdate(itemRoot_api_constr... iacs) {
       super.onProgressUpdate(iacs);
       // assuming method itemListToListings updates UI
       // if it doesn't then publishProgress and onProgressUpdate are not needed 
       // and itemListToListings can be done in doInBackground
       this.itemListToListings.itemListToListings(iacs[0]);
 }

  @Override
  protected Void onPostExecute(Void void) {
    super.onPostExecute(void);   
    // unused    
 }
}

经过一段时间的努力,我解决了一些错误,但我仍然坚持使用
publishProgress(spidyHttpGetRequest(makeUrl(n))
returning
itemRoot\u api\u constr无法应用于JSONObject
您需要检查您的AsyncTask现在是否为AsyncTask及其方法的所有返回值。错误在于
doInbackground
中的循环从未指向
JoToJO\u构造函数
,而仅指向
spidyHttpGetRequest
。这是正确的代码现在
publishProgress(JoToJO_构造函数(spidyHttpGetRequest(makeUrl(n)))很遗憾,在
doInBackground
循环开始之前,我现在得到了一个NullPointerException,当循环完成时,应用程序崩溃了?您可以在编辑2下的帖子中看到错误日志和更多内容。感谢您的回复和编辑,现在不幸的是,出现了另一个错误,我用新的错误替换了我在顶部帖子中的错误,我现在在
itemsbynput\u AsyncTask
=
公共类itemsbynput\u AsyncTask扩展了AsyncTask{
和第89行=
itemListToListings.itemListToListings(iacs[0]);}
onProgressUpdate()
中,您是否完成了这个itemsByInput\u AsyncTask.setItemListToListings(this);?@在神话中,我不敢相信我自己无法理解。在第一次测试您的代码时,我评论说,因为它返回了一个错误(不知道我为什么这么做)也从未想过要把它移回去。不管怎样,你提供的代码现在运行得非常完美,非常感谢!我在回答中添加了最后一个注释,以解决另一个问题。希望它对你有用。
public class itemsByInput_AsyncTask extends AsyncTask<Void, itemRoot_api_constr, Void> {

 JSONObject Jo_result;
 private itemListToListings itemListToListings;
 String userSearchRequest;

 public itemsByInput_AsyncTask(String userSearchRequest){
  this.userSearchRequest = userSearchRequest;
 } 

 private String makeUrl(int page){
    return "http://www.gw2spidy.com/api/v0.9/json/item-search/" + 
           this.userSearchRequest + "/" + page;
 }

 @Override
 protected Void doInBackground(Void... params) {
    itemRoot_api_constr iac;

    iac = JoToJO_constructor(spidyHttpGetRequest(makeUrl(0)));
    nPage = iac.getLast_page();
    publishProgress(iac);

    for (int n = 1; n<nPage; n++){
         publishProgress(spidyHttpGetRequest(makeUrl(n)));
    }
    return null;
 }

 @Override
 protected void onProgressUpdate(itemRoot_api_constr... iacs) {
       super.onProgressUpdate(iacs);
       // assuming method itemListToListings updates UI
       // if it doesn't then publishProgress and onProgressUpdate are not needed 
       // and itemListToListings can be done in doInBackground
       this.itemListToListings.itemListToListings(iacs[0]);
 }

  @Override
  protected Void onPostExecute(Void void) {
    super.onPostExecute(void);   
    // unused    
 }
}
  ListView lv1;
  ArrayList<listItemWidgets_constr> image_details = new ArrayList<>();
  itemListAdapter adapter; 

  void onCreate(){
    ...
    lv1 = (ListView) findViewById(R.id.listView);
    adapter = new itemListAdapter(this, image_details);
    lv1.setOnItemClickListener(...);
  }

  public void itemListToListings(final itemRoot_api_constr spidy_iTN_construct) {
        image_details.clear();
        image_details.addAll(getListData(spidy_iTN_construct));
        adapter.notifyDataSetChanged();      
    }