0

これが私の問題です。

FQL クエリを作成し、応答データを保存しています。私のコードは正常に動作しますが、アプリを実行してから約 4 分後に JSONException が発生します。例外は読み取ります

   A JSONArray text must start with '[' at character 0 of 

URLを入力すると、クエリがブラウザに作成されるため、これは奇妙です。次のようになります

[{"uid":SOMENUMBER},{"uid":SOMENUMBER}]

これは明らかに「[」文字で始まります。

リクエストはこちら

         String query = "SELECT uid FROM user WHERE is_app_user=1 and uid IN (SELECT uid2 FROM friend WHERE uid1 =" + fbId + ")";
         Bundle params = new Bundle();
         params.putString("method", "fql.query");
         params.putString("query", query);
         mAsyncFacebookRunner.request(null, params, new FQLRequestListener());

これがリクエストリスナーです

    private class FQLRequestListener implements RequestListener
    {

        @Override
        public void onComplete(String response, Object state) 
        {
            try {
                JSONArray json = new JSONArray(response);
                friendsIds = new ArrayList<String>();
                for(int i = 0; i < json.length(); ++i)
                {
                        String uid = json.getJSONObject(i).getString("uid");
                        friendsIds.add(uid);
                        Log.d("friends", friendsIds.get(i));
                }
                InviteFriends.this.runOnUiThread(new Runnable()
                {
                    @Override
                    public void run() 
                    {
                            setUpList();
                    }
                });

            } catch (JSONException e) {
                e.printStackTrace();

            } 
        }

そして、スタック..

06-15 16:43:21.744: D/Facebook-Util(866): GET URL: THIS IS THE URL THAT WORKS IN A BROSWER (actual URL removed)
06-15 16:43:21.774: W/System.err(866): org.json.JSONException: A JSONArray text must start    with '[' at character 0 of 
06-15 16:43:21.774: W/System.err(866):  at org.json.JSONTokener.syntaxError(JSONTokener.java:448)
06-15 16:43:21.774: W/System.err(866):  at org.json.JSONArray.<init>(JSONArray.java:104)
 06-15 16:43:21.774: W/System.err(866):     at org.json.JSONArray.<init>(JSONArray.java:150)
 06-15 16:43:21.774: W/System.err(866):     at rageup.android.InviteFriends$FQLRequestListener.onComplete(InviteFriends.java:129)
 06-15 16:43:21.774: W/System.err(866):     at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:254)

私はそれに注意する必要があります..

  1. ログアウトして再度ログインすると、クエリが機能します。

  2. Facebook セッションが有効であることを確認しました。

  3. Facebook が提供する「Hackbook」の例では、友達のリストをダウンロードするときに同じ問題が発生します。

例外取得の流れ

  1. ユーザーがログインするホームページ

  2. ユーザーがボタンをクリックして 2 番目のアクティビティを開始する

  3. 2 番目のアクティビティは、クエリが作成される場所です

  4. 帰宅

  5. ログインを除いて、約 4 分後に繰り返します

4

2 に答える 2

1

私はまったく同じ問題を抱えています.fqlを呼び出す(asyncfqlrunnerではなく単純なfql呼び出し)私はまったく問題はありません. 数分 (2-4) 待ってから再度 fql リクエストを送信しようとすると、facebook android api で例外が発生します。

JSONObject テキストは、文字 0 で '{' で始まる必要があります

また、fb セッションが有効であり、クエリが正しいことも確認しました。実行時以外は何も変わっていません。

メソッドを書き直すアプローチを試みました private static String read(InputStream in) throws IOExceptionが、それでもエラーが発生します。

EDIT facebook でさえこの問題を認識しておらず、誰もこれについて投稿していないので、私は自分でそれを理解しました。通常の request-method (非同期メソッドではない) を使用する場合は、FB-API の Facebook.java に移動し、 の次の行を変更しますpublic String request(Bundle parameters)

から:

return request(null, parameters, "GET");

return request(null, parameters, "POST");

そして、すべてがうまくいくはずです!

于 2012-09-08T16:26:11.527 に答える
1

最初に応答の検証を試みます。私は使うだろう:

JSONObject json = new JSONObject(response);

メソッドを使用して json オブジェクトの内容を確認できます。Facebook API が常に期待される形式のデータに応答するとは限りません。できるよ:

Log.w("FacebookListener", "Unexpected response: " + response);

次に、Logcat の出力を調べます。

わかった。まだテストしていませんが、http://developers.facebook.com/docs/reference/rest/fql.query/によると fqlクエリのグラフパスは「fql」です

あなたはmAsyncFacebookRunner.request(null, params, new FQLRequestListener());nullを渡しますが、「fql」はおそらく期待されています

編集 graphapiエクスプローラーで確認しました-「クエリ」を単純な「q」に置き換えると機能します。アプリ内で認証されていることを確認します (シングル サインオンまたは OAuth ダイアログ)。

Bundle params = new Bundle();
params.putString("q", query);
mAsyncFacebookRunner.request("fql", params, new FQLRequestListener());

別の編集: 別のプロジェクトに取り組んでいるときに、Facebook Util クラスのメソッド「読み取り」に問題がある可能性があることに気付きました - 時々 (InputStream にデータがあったとしても) BufferedReader が null を返し、ループを壊しました。メソッドの本体を次のように変更しました。

 private static String read(InputStream in) throws IOException {
    StringBuffer sb = new StringBuffer();
    final InputStreamReader rd = new InputStreamReader(in);
    try {
        final char[] buffer = new char[1024];
        int read;
        while((read = rd.read(buffer)) != -1){
            sb.append(buffer, 0, read);
        }
    } catch (Exception e) {

    } finally {
        try {
            rd.close();
        } catch (Exception e2) {

        }
    }
    return sb.toString();
}

そしてそれはうまくいきました。

于 2012-06-18T08:06:50.023 に答える