好的,这是我的问题。
我正在进行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)
我应该注意到......
当我退出并重新登录时,查询有效。
我确保我的Facebook会话有效。
Facebook提供的“Hackbook”示例在下载朋友列表时遇到同样的问题。
获得例外的流程
用户登录的主页
用户点击按钮开始第二项活动
第二个活动是查询的位置
返回首页
约4分钟后重复,减去登录
答案 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");
一切都应该正常工作!