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

时间:2015-04-30 16:15:10

标签: java android json object android-asynctask

我希望以JSON " Mini" 为例(实际上是用户输入变量),最后一个数字是您正在查看的页面。每页最多可容纳50个结果。 this api Link格式(我必须阅读并存储为JSON,这是为了便于理解)

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

我有能够阅读一页的代码。我不知道如何让它遍历所有页面并添加到相同的对象列表。

在acitivty.java onCreate中,我调用了AsyncTask。

get request

这是我的名为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类
itemsByInput_AsyncTask.java

最后在我的activity.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); } } 中使用我的对象。

如何在所有页面(itemListToListings()属性)中循环,并将所有JSON值作为对象添加到同一列表中。

编辑:我的活动中的last_page功能。

itemListToListings

编辑3:错误日志

public void itemListToListings(final itemRoot_api_constr spidy_iTN_construct) {
            ArrayList<listItemWidgets_constr> image_details = getListData(spidy_iTN_construct);
            final ListView lv1 = (ListView) findViewById(R.id.listView);
            lv1.setAdapter(new itemListAdapter(this, image_details));
            lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                    //listItemWidgets_constr newsData = (listItemWidgets_constr) lv1.getItemAtPosition(position);
                    Toast.makeText(resultsActivity.this, "Selected :" + spidy_iTN_construct.results(position).name, Toast.LENGTH_LONG).show();

                    Intent i = new Intent(resultsActivity.this, listingsActivity.class);
                    i.putExtra("itemId", spidy_iTN_construct.results(position).data_id);
                    startActivity(i);
                }
            });
        }

我在Logcat中收到此错误后,仍然会在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)

中看到日志更新中的以下内容
doInBackground

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

1 个答案:

答案 0 :(得分:1)

我认为您希望根据从第一页获得的last_page属性进行链式调用。我会做这样的事情,每次完成请求时,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    
 }
}

此外: 应启动适配器,视图和相关的单击侦听器一次。您应该将itemListToListings内的所有变量作为“活动”字段移动,以便每次调用此回调时,都不需要再次启动它们。

  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();      
    }