2013-06-05 109 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); ) 第一次。