成功通话后Android FQL呼叫返回空[标题已更改]

时间:2012-06-15 23:51:41

标签: android facebook facebook-fql

好的,这是我的问题。

我正在进行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());

这是RequestListener

    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();

            } 
        }

和Stack ..

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”示例在下载朋友列表时遇到同样的问题。

  4. 获得例外的流程

    1. 用户登录的主页

    2. 用户点击按钮开始第二项活动

    3. 第二个活动是查询的位置

    4. 返回首页

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

2 个答案:

答案 0 :(得分: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类的方法“read”可能存在问题 - 有时(即使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();
}

并且有效。

答案 1 :(得分:1)

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

  

JSONObject文本必须以

的字符0处的“{”开头

我还确保fb会话有效且查询正确。除了执行时间之外没有任何改变。

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

修改 因为即使是facebook也没有意识到这个问题,也没有其他人发布任何有关此事的信息,我自己已经想到了。使用常规请求方法(而不是异步方法)时,请转到FB-API中的Facebook.java并更改以下行 public String request(Bundle parameters)

FROM:

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

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

一切都应该正常工作!