2013-06-05 78 views
52

我正在使用新的FaceBook SDK 3.0。在將圖片從網址發佈到「我/照片」時,我間歇性地獲得了EOFException。我偶爾會遇到這個錯誤(約20次)。Facebook SDK 3 EOFException

如果我再次重試發佈,我還必須添加,如果我得到EOFException,它成功發佈。

因此,目前我已編碼自動重試一次,如果我得到EOFException和解決方案似乎令人滿意。

但我需要知道是什麼導致它,它是Android SDK中的錯誤。我搜索了很多,但沒有得到任何東西。

我張貼日誌(刪除出於安全原因,我的訪問令牌和圖像URL)

06-05 15:09:42.585: D/FacebookSDK.Request(16611): Request: 
06-05 15:09:42.585: D/FacebookSDK.Request(16611): Id: 9 
06-05 15:09:42.585: D/FacebookSDK.Request(16611): URL:https://graph.facebook.com/me/photos?caption=abc&format=json&sdk=android&migration_bundle=fbsdk%3A20121026&access_token=ADBCEFG&url=http%3A%2F%2Ftest.test.test%2Ftest%2Ftest%2F201695%2Ftest%2F18629 
06-05 15:09:42.585: D/FacebookSDK.Request(16611): Method: POST 
06-05 15:09:42.585: D/FacebookSDK.Request(16611): User-Agent: FBAndroidSDK.3.0.0 
06-05 15:09:42.585: D/FacebookSDK.Request(16611): Content-Type: multipart/form-data; boundary=3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f 
06-05 15:09:42.585: D/FacebookSDK.Request(16611): Parameters: 
06-05 15:09:42.585: D/FacebookSDK.Request(16611):  caption: abc 
06-05 15:09:42.585: D/FacebookSDK.Request(16611):  format: json 
06-05 15:09:42.585: D/FacebookSDK.Request(16611):  sdk: android 
06-05 15:09:42.585: D/FacebookSDK.Request(16611):  migration_bundle: fbsdk:20121026 
06-05 15:09:42.585: D/FacebookSDK.Request(16611):  access_token: ABCDEF 
06-05 15:09:42.585: D/FacebookSDK.Request(16611):  url: http://test.test.test/test/test/201695/test/18629 
06-05 15:09:42.585: D/FacebookSDK.Request(16611): Attachments: 
06-05 15:09:42.600: D/FacebookSDK.Response(16611): Response <Error>: java.io.EOFException 
+0

在Android中有這樣的錯誤。必須處理System類的http.keepalive屬性。可能值得研究。 – tolgap

+1

在這種情況下,EOFException意味着沒有更多數據要讀取,而(在這種情況下)只能表示文件爲空。 –

+0

任何一個發現此錯誤的解決方案? – user2106897

回答

0

這聽起來像你可能有一些網絡連接問題。

你可以寫一些retrylogic來通過再次提交來處理這個異常,或者看看你用來上傳的類是否有辦法增加事務的超時時間!

1

問題

這是一個HttpURLConnection相關的問題。從連接池中選擇用於連接的實際套接字。大多數服務器創建持久連接(Connection: Keep-Alive標題),以便重複使用現有套接字,這比每次創建新套接字便宜。問題來自於這些插座打開了一段時間,大部分時間都在60秒左右,然後它們被關閉,不能重複使用。然而,Android操作系統嘗試使用相同的套接字,因爲它認爲套接字仍然很好,因爲它被分配給同一個主機,所以它開始發送等待ACK和其他響應包的包,不再開放,雖然它一直期待一些答案,因此EOFException

解決方案

第1步 - 限制池大小,以相對較少的

private static final int MAX_CONNECTIONS = 5; 
// ... 
static { 
    System.setProperty("http.maxConnections", String.valueOf(MAX_CONNECTIONS)); 
} 

第2步 - 實現一個重試機制

無論你使用Facebook的代碼,並得到一個EOFException ,將其封裝在try-catch中,以捕獲異常並重試連接到最大池大小的URL。這裏有一個方法存根,可用於(我不知道Facebook的SDK,因此TODO):

private void connect(int retryNumber) { 
    try { 
     // TODO your facebook code goes here 
    } catch (EOFException e) { 
     if (retryNumber > MAX_CONNECTIONS) { 
      // TODO handle exception, it's over the limit, so it is a different problem 
     } else { 
      // TODO disconnect first, if possible 
      connect(retryNumber + 1); 
     } 
    } catch (Exception e) { 
     // TODO other exception handling 
    } finally { 
     // TODO disconnect, if possible 
    } 
} 

當然,你必須調用此方法0 retryNumber(connect(0); ) 第一次。