【问题标题】:AsyncTask and JSON, onSuccess doesn't return anythingAsyncTask 和 JSON,onSuccess 不返回任何内容
【发布时间】:2013-05-28 10:53:17
【问题描述】:

我是带着另一个问题来的。我将我的 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 += ",";
                }
            }

        }

    }

【问题讨论】:

  • 你在ListView上看到你想要的数据了吗?你的调试监视器会带你进入onPostExecute
  • 打印有异常吗?
  • 我认为你应该放一些日志消息来检查你的代码在什么时候工作。
  • 你在使用loopj api吗?
  • 当我进入 onPostExecute 时,它​​会显示一个登录 logcat。但是在 onSuccess listCategories 里面有数据,在外面,onPostExecute 结果在 logcat 中显示为 []

标签: android json android-asynctask


【解决方案1】:

如果您使用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);

    }
  });

【讨论】:

  • 谢谢,我不知道
  • 我也遇到了类似的问题!我使用 ρяσѕρєя K 方式通过 AsyncTask 进行异步登录,但它不起作用并且我得到一个 nullPointerException。如果我在主线程中登录它工作正常。为什么?我正在使用 loopj 库!
【解决方案2】:

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

【讨论】:

  • 为什么这是答案而不是评论?
  • 为什么要评论?
【解决方案3】:

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

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

在你的 for 循环之前也使用这个

   listCategories = new List<Category>();

希望对您有所帮助。

【讨论】:

  • 当我进入 onPostExecute 时,它​​会显示一个登录 logcat。但是在 onSuccess listCategories 里面有数据,在外面,onPostExecute 结果在 logcat 中显示为 []
猜你喜欢
  • 2013-06-21
  • 2017-04-30
  • 1970-01-01
  • 2017-12-08
  • 2017-11-25
  • 1970-01-01
  • 2020-04-27
  • 2019-04-06
  • 2012-02-15
相关资源
最近更新 更多