0

「me/home」グラフAPIを呼び出した後、JSONの結果を解析しているときに、FQLを使用して別のクエリを作成しようとしています。FQLクエリの問題は、以前の質問で解決されました。

私の実装の背景は次のとおりです。私はを使用しており、メインアクティビティから、複数のを使用してBaseAdapter解析されたデータを送信しています。FQLクエリを作成していない場合、すべてが桃色です。しかし、FQLクエリを導入すると、クエリは常にに設定された後に実行されます。これにより、arrayindexoutofbound例外が発生し続けます。JSONArrayListsadapterListView

これは、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();
            }
        }
    }

デバッグを使用して、クラッシュの原因は2番目のクエリが完了する前に呼び出されたsetAdapterであることがわかりました。クラッシュが発生した後、ログがlogcatに追加されているのがわかります。

これに対する解決策についての助けはありがたいです

更新:私があきらめようとしていたとき、ほとんど解決策を見つけました。

4

1 に答える 1

1

解決

したがって、質問で使用されている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
}

彼らが私のように立ち往生している場合、これが誰かが時間を節約するのに役立つことを願っています。

于 2012-05-25T02:41:39.750 に答える