在分析图形 API 结果时运行 FQL 查询会给出 arrayindexoutofbound 异常



在调用"me/home"图形API后,在解析JSON结果时,我正在尝试使用FQL进行另一个查询。FQL 查询问题已在我之前的问题中解决。

我的实现背景是:我正在使用BaseAdapter,从主活动发送使用多个ArrayListsJSON解析的数据。如果我不进行 FQL 查询,一切都是桃色的。但是当我引入 FQL 查询时,查询总是在将adapter设置为 ListView 后运行。这一直导致数组索引越界异常。

这是我在解析 JSON 结果时使用的代码,包括其他 FQL 查询。为了保持代码简短,我将包含相关部分,因为其余部分工作正常。但是,如果需要更多,我也会提出来。

// GET THE POST'S LIKES COUNT
if (json_data.has("likes")) {
    JSONObject feedLikes = json_data.optJSONObject("likes");
    String countLikes = feedLikes.getString("count");
    postLikesCountArrayList.add(countLikes);
    // TEST STARTS
    Runnable run = new Runnable() {
    @Override
    public void run() {
        graph_or_fql = "fql";
        String query = "SELECT likes.user_likes FROM stream WHERE post_id = '" 
        + finalThreadID + "'";
        Bundle params = new Bundle();
        params.putString("method", "fql.query");
        params.putString("query", query);
        Utility.mAsyncRunner.request(null, params, new LikesListener());
        }
    };
    TestNewsFeeds.this.runOnUiThread(run);                      
    // TEST ENDS
} else {
    String countLikes = "0";
    postLikesCountArrayList.add(countLikes);
}

这是LikesListener类的代码。它是在同一活动中声明的私有类:

private class LikesListener extends BaseRequestListener {
        @Override
        public void onComplete(final String response, final Object state) {
//          Log.e("response", response);
            try {
                JSONArray JALikes = new JSONArray(response);
//              Log.v("JALikes", JALikes.toString());
                for (int j = 0; j < JALikes.length(); j++) {
                    JSONObject JOTemp = JALikes.getJSONObject(j);
//                  Log.e("JOTemp", JOTemp.toString());
                    if (JOTemp.has("likes"))    {
                        JSONObject optJson = JOTemp.optJSONObject("likes");
//                      Log.v("optJson", optJson.toString());
                        if (optJson.has("user_likes"))  {
                            String getUserLikeStatus = optJson.getString("user_likes");
                            Log.e("getUserLikeStatus", getUserLikeStatus);
                            arrayLikeStatus.add(getUserLikeStatus);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

我已经使用调试确定崩溃的原因是在第二个查询完成之前调用的 setAdapter。我看到崩溃发生后日志被添加到 logcat 中。

对此解决方案的任何帮助将不胜感激

更新:几乎在我即将放弃时找到了解决方案。

解决方案

因此,不是像问题中使用的那样调用 BaseRequestListener,而是必须进行此修改。

try {
    graph_or_fql = "fql";
    String query = "SELECT likes.user_likes FROM stream WHERE post_id = '"
            + finalThreadID + "'";
//                          Log.d("finalThreadID", finalThreadID);
    Bundle params = new Bundle();
    params.putString("method", "fql.query");
    params.putString("query", query);
//                          Utility.mAsyncRunner.request(null, params, new LikesListener());
    String fqlResponse = Utility.mFacebook.request(params);
//                          Log.e("fqlResponse", fqlResponse);
    JSONArray JALikes = new JSONArray(fqlResponse);
//                          Log.v("JALikes", JALikes.toString());
    for (int j = 0; j < JALikes.length(); j++) {
        JSONObject JOTemp = JALikes.getJSONObject(j);
//                              Log.e("JOTemp", JOTemp.toString());
        if (JOTemp.has("likes"))    {
            JSONObject optJson = JOTemp.optJSONObject("likes");
//                                  Log.v("optJson", optJson.toString());
            if (optJson.has("user_likes"))  {
                String getUserLikeStatus = optJson.getString("user_likes");
//                                      Log.e("getUserLikeStatus", getUserLikeStatus);
                arrayLikeStatus.add(getUserLikeStatus);
//                                      Log.d("arrayLikeStatus", arrayLikeStatus.toString());
            }
        }
    }
} catch (Exception e) {
    // TODO: handle exception
}

希望这有助于有人在像我一样被困住时节省时间。

最新更新