2012-08-06 49 views
0

我已經將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。

回答

0

我會聯繫Parse支持並詢問他們可能會出現什麼問題。從我廣泛使用Facebook Android SDK的經驗來看,我從來沒有見過這樣的錯誤。作爲一個瘋狂的猜測,可能會錯誤地將OnError回調視爲常規回調,並試圖將響應解析爲JSON,而以純文本格式爲例。

什麼阻止您使用原始Facebook SDK?這很簡單

+0

我開始認爲,但現在我已經發現,通過Facebook.request()獲取朋友列表時,我會得到相同的週期性錯誤。這個方法沒有被Parse API包裝,所以如果你從未見過這些錯誤,我認爲它一定是我正在做的事情。我將在編輯中發佈代碼。 – alexc 2012-08-07 00:09:41

+0

至於你的問題,主要是因爲我已經使用Parse的其他功能,它提供了一個很好的方式來處理我自己的用戶系統中的Facebook用戶數據。除了這些罕見的錯誤之外,它確實能夠很好地工作,所以我希望儘可能使用它。 – alexc 2012-08-07 00:18:59