Facebook SSOをAndroidアプリと統合しましたが、80〜85%の確率で正常に動作します。しかし、たまに空のJSONが返されることがあり、その理由はわかりません。Facebookと統合するためにParseを使用しています。コードは次のとおりです。
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()のラッパーであり、ParseExceptionでラップされた例外を除いて、結果をParse自身のコールバックに送信します。失敗すると、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のサーバーはそれほど信頼できないものではなく、何か他のことが起こっているのではないかと私に思わせるほど頻繁に発生します。
他の誰か、特に解析ユーザーが似たようなことを経験しますか?
編集: Facebook.request()を介してユーザーの友達のリストを取得しようとすると、まったく同じエラーが表示されます:
String friends = ParseFacebookUtils.getFacebook().request("me/friends");
JSONObject result = Util.parseJson(friends);
解析にはFacebookSDKの完全なコピーが含まれているため、このメソッドはFacebookインスタンスを介した標準の純粋な呼び出しにすぎません。10回のうち9回動作しますが、ここでも、同じ定期的なJSONExceptionがparseJson()でスローされます。