我已经将 Facebook SSO 与我的 Android 应用程序集成在一起,我会说大约 80-85% 的时间它运行良好。但每隔一段时间,它就会返回一个空的 JSON,我不知道为什么。我正在使用Parse与 Facebook 集成,代码如下:
ParseFacebookUtils.logIn(mContext, new LogInCallback() {
@Override
public void done(ParseUser user, ParseException ex) {
if (user != null) {
//login successful
} else if (ex != null) {
ex.printStackTract();
//something failed
}
}
});
这个 logIn() 方法基本上是 Facebook.authorize() 的包装器,它将结果发送到 Parse 自己的回调,任何异常都包装在 ParseException 中。当它失败时,它会给我一个 JSONException:
08-06 14:53:16.706: W/System.err(13996): com.parse.ParseException: org.json.JSONException: End of input at character 0 of
08-06 14:53:16.721: W/System.err(13996): at com.parse.ParseUser$8.onError(ParseUser.java:944)
08-06 14:53:16.721: W/System.err(13996): at com.parse.auth.FacebookAuthenticationProvider.handleError(FacebookAuthenticationProvider.java:189)
08-06 14:53:16.721: W/System.err(13996): at com.parse.auth.FacebookAuthenticationProvider.access$1(FacebookAuthenticationProvider.java:185)
08-06 14:53:16.721: W/System.err(13996): at com.parse.auth.FacebookAuthenticationProvider$GetUserIdBackgroundTask.onPostExecute(FacebookAuthenticationProvider.java:49)
08-06 14:53:16.721: W/System.err(13996): at android.os.AsyncTask.finish(AsyncTask.java:417)
08-06 14:53:16.721: W/System.err(13996): at android.os.AsyncTask.access$300(AsyncTask.java:127)
08-06 14:53:16.721: W/System.err(13996): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
08-06 14:53:16.725: W/System.err(13996): at android.os.Handler.dispatchMessage(Handler.java:99)
08-06 14:53:16.725: W/System.err(13996): at android.os.Looper.loop(Looper.java:123)
08-06 14:53:16.725: W/System.err(13996): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-06 14:53:16.733: W/System.err(13996): at java.lang.reflect.Method.invokeNative(Native Method)
08-06 14:53:16.733: W/System.err(13996): at java.lang.reflect.Method.invoke(Method.java:521)
08-06 14:53:16.733: W/System.err(13996): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
08-06 14:53:16.737: W/System.err(13996): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-06 14:53:16.737: W/System.err(13996): at dalvik.system.NativeStart.main(Native Method)
08-06 14:53:16.737: W/System.err(13996): Caused by: org.json.JSONException: End of input at character 0 of
08-06 14:53:16.757: W/System.err(13996): at org.json.JSONTokener.syntaxError(JSONTokener.java:446)
08-06 14:53:16.757: W/System.err(13996): at org.json.JSONTokener.nextValue(JSONTokener.java:93)
08-06 14:53:16.757: W/System.err(13996): at org.json.JSONObject.<init>(JSONObject.java:154)
08-06 14:53:16.757: W/System.err(13996): at org.json.JSONObject.<init>(JSONObject.java:171)
08-06 14:53:16.757: W/System.err(13996): at com.parse.auth.FacebookAuthenticationProvider$GetUserIdBackgroundTask.doInBackground(FacebookAuthenticationProvider.java:38)
08-06 14:53:16.757: W/System.err(13996): at com.parse.auth.FacebookAuthenticationProvider$GetUserIdBackgroundTask.doInBackground(FacebookAuthenticationProvider.java:1)
08-06 14:53:16.761: W/System.err(13996): at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-06 14:53:16.761: W/System.err(13996): at java.util.concurrent.FutureTask$Sync.innerRun (FutureTask.java:305)
08-06 14:53:16.761: W/System.err(13996): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-06 14:53:16.764: W/System.err(13996): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
08-06 14:53:16.764: W/System.err(13996): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
08-06 14:53:16.764: W/System.err(13996): at java.lang.Thread.run(Thread.java:1096)
通常,如果我只是在之后立即尝试再次登录,它就会起作用。由于它是如此不一致,我真的不知道是什么原因造成的。这是 Facebook 刚刚发生的事情,还是 Parse 更有可能是罪魁祸首?
在一个可能相关的注释中,由于超时或损坏的管道做同样的事情,我也会间歇性地得到 IOExceptions。这些通常会重复几次尝试,然后它会再次起作用。就像我说的,这些错误并不常见,但它们经常发生,足以让我认为 Facebook 的服务器不可能那么不可靠,而且可能还会发生其他事情。
还有其他人经历过类似的事情,尤其是 Parse 用户吗?
编辑:所以当我尝试通过 Facebook.request() 获取用户朋友的列表时,会弹出相同的错误:
String friends = ParseFacebookUtils.getFacebook().request("me/friends");
JSONObject result = Util.parseJson(friends);
Parse 包含 Facebook SDK 的完整副本,因此此方法只是通过 Facebook 实例的标准纯调用。它在 10 次中工作 9 次,但是同样的周期性 JSONException 被抛出 parseJson();