3

我在这里还有另一个问题。我将我的 AsyncTask 函数中的代码发布给您,以从 JSONObject(Web 服务)中获取值。我的问题是我有一个列表,我在 onSuccess 方法中用来自 json 的数据填充这个列表,但后来,在 AsyncTask 的 onPostExecute 方法中,“结果”为空。

private class getCategories extends AsyncTask<String, Void, List<Category>> {

        private int num_cat_subcat; // category count

        @Override
        protected List<Category> doInBackground(String... arg0) {
            AsyncHttpClient client = new AsyncHttpClient();
            client.get(arg0[0], null, new JsonHttpResponseHandler() {

                public void onSuccess(JSONObject data) {
                    try {
                        JSONObject response = data.getJSONObject("response");
                        JSONArray categories = response
                                .getJSONArray("categories");

                        // elements count
                        num_cat_subcat = categories.length();

                        for (int i = 0; i < categories.length(); i++) {
                            JSONObject item = (JSONObject) categories
                                    .getJSONObject(i);

                            if (item.getString("id").equalsIgnoreCase(
                                    "4d4b7105d754a06376d81259")) {
                                JSONArray subcategories = item
                                        .getJSONArray("categories");

                                // Category --> id, name, pluralName, shortName,
                                // icon_prefix, icon_suffix, primary, parentId
                                Category newItem = new Category(item
                                        .getString("id"), item
                                        .getString("name"), item
                                        .getString("pluralName"), item
                                        .getString("shortName"), null, null,
                                        null);
                                listCategories.add(newItem);
                                newItem = null;

                                if (subcategories.length() > 0) {
                                    // Si tiene subcategorias las contamos.
                                    num_cat_subcat += subcategories.length();

                                    for (int j = 0; j < subcategories.length(); j++) {
                                        JSONObject subitem = (JSONObject) subcategories
                                                .getJSONObject(j);

                                        Category newSubItem = new Category(
                                                subitem.getString("id"),
                                                subitem.getString("name"),
                                                subitem.getString("pluralName"),
                                                subitem.getString("shortName"),
                                                null, null, item
                                                        .getString("id"));
                                        listCategories.add(newSubItem);
                                        newSubItem = null;
                                    }
                                }
                            }
                        }
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                public void onFailure(Throwable arg0) {

                }
            });
            return listCategories;
        }

        @Override
        protected void onPostExecute(List<Category> result) {
            Log.i("result", result.toString());

            for (int k = 0; k < result.size(); k++) {
                ALLOFTHEM += result.get(k).getId();
                if (k < result.size() - 1) {
                    ALLOFTHEM += ",";
                }
            }

        }

    }
4

3 回答 3

3

如果您使用的是loopj android-async-http,则无需AsyncTask用于从服务器获取数据doInBackground并在 onPostExecute 中更新 UI,因为onSuccess方法总是在后台计算后在 UI 线程上执行。只需在没有 AsyncTask 的情况下这样做:

 AsyncHttpClient client = new AsyncHttpClient();
 client.get("Pass Url Here", null, new JsonHttpResponseHandler() {
     @Override
     public void onSuccess(JSONObject data) {
          // update your ListView here
      }
    @Override
    public void onFailure(Throwable arg0, JSONObject arg1) {
        // TODO Auto-generated method stub

         super.onFailure(arg0, arg1);

    }
  });
于 2013-05-28T11:08:50.830 回答
2

onPostExecuteddoInBackground执行完毕时调用。如果get方法AsyncHttpClient不是阻塞方法,在解析结果onPostExecuted之前调用onSuccess

于 2013-05-28T10:58:06.300 回答
0

在 onSuccess 解析结果之前调用 onPostExecuted,因此请尝试在循环中显示某些内容或调试该代码。

    Log.e("Test", item.getString("id"));//inside for Loop

并在你的 for 循环之前使用它

   listCategories = new List<Category>();

希望它有所帮助。

于 2013-05-28T11:06:37.587 回答