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. 用户单击按钮开始第二个活动

  3. 第二个活动是进行查询的地方

  4. 回家

  5. 大约 4 分钟后重复,减去登录

4

2 回答 2

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 explorer上检查过它——当“查询”被简单的“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 回答
1

我有完全相同的问题:调用 fql(简单的 fql 调用,而不是 asyncfqlrunner)我完全没有问题。如果我等待几分钟 (2-4) 并再次尝试发送 fql 请求,我会收到 facebook android api 的异常:

JSONObject 文本必须在字符 0 处以“{”开头

我还确保了 fb 会话有效且查询正确。什么都没有改变,除了执行的时间。

我尝试了重写该 private static String read(InputStream in) throws IOException方法的方法,但错误仍然存​​在。

编辑 因为即使是 facebook 也不知道这个问题,也没有其他人发布过任何关于此的内容,所以我自己已经弄清楚了。当使用普通请求方法(不是异步方法)时,转到 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 回答