我已經將Facebook SSO與我的Android應用程序集成在一起,並且我會說約有80-85%的時間工作正常。但每過一段時間,它都會返回一個空的JSON,我不知道爲什麼。我使用Parse與Facebook的整合,這裏是代碼:Facebook登錄偶爾會返回空JSON
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中。當它失敗時,它給了我一個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發生的事,還是解析更可能的罪魁禍首?
在一個可能相關的說明中,由於超時或管道做同樣的事情,我也會間歇性地得到IOExceptions。這些通常會經過幾次嘗試,然後再次運行。就像我說的那樣,這些錯誤並不常見,但它們經常發生,足以讓我認爲Facebook的服務器不可靠,而且可能會發生其他事情。
任何人都會遇到類似的問題,尤其是解析用戶?
編輯:所以完全相同的錯誤,如雨後春筍般冒出,當我試圖通過Facebook.request()來獲取用戶的朋友列表:
String friends = ParseFacebookUtils.getFacebook().request("me/friends");
JSONObject result = Util.parseJson(friends);
解析包含了Facebook SDK的完整副本所以這個方法只是通過Facebook實例的標準純粹呼叫。它的工作原理是10次中的9次,但同樣的,在parseJson()上引發相同的週期性JSONException。
我開始認爲,但現在我已經發現,通過Facebook.request()獲取朋友列表時,我會得到相同的週期性錯誤。這個方法沒有被Parse API包裝,所以如果你從未見過這些錯誤,我認爲它一定是我正在做的事情。我將在編輯中發佈代碼。 – alexc 2012-08-07 00:09:41
至於你的問題,主要是因爲我已經使用Parse的其他功能,它提供了一個很好的方式來處理我自己的用戶系統中的Facebook用戶數據。除了這些罕見的錯誤之外,它確實能夠很好地工作,所以我希望儘可能使用它。 – alexc 2012-08-07 00:18:59