2013-06-05 10 views
52

私は新しいFaceBook SDK 3.0を使用しています。 URLから「me/photos」に画像を投稿している間に、私は断続的にEOFExceptionを取得しています。私はこのエラーを1回(20回に1回)受け取ります。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

Spring Androidでもこのようなエラーがありました。 Systemクラスのhttp.keepaliveプロパティに関する何かをしなければならなかった。探してみる価値があるかもしれません。 – tolgap

+1

この場合、EOFExceptionは読み取るべきデータがもう存在しないことを意味します。この場合も、ファイルが空であることを意味します。 –

+0

このエラーの解決策はありますか? – user2106897

答えて

0

を掲示しています。

この例外を処理するためにretrylogicに書き込んだり、アップロードするクラスがトランザクションのタイムアウトを増やす方法を持っているかどうかを確認することができます。

1

問題

これはHttpURLConnection関連の問題です。接続に使用される実際のソケットは、プールから選択されます。ほとんどのサーバーでは、永続的な接続(Connection: Keep-Aliveヘッダー)を作成して、毎回新しいソケットを作成するよりも安価な既存のソケットを再利用します。この問題は、これらのソケットが特定の時間(ほとんど60秒程度)開いていて、閉じられていて再利用できないという事実に由来します。しかし、Android OSは同じソケットを使用しようとします。なぜなら、同じホストに割り当てられているので、ソケットはまだ良いと思うから、ACKや他の応答パッケージを待っているパッケージを送信し始めます。もう開いていないが、それはある答えを期待しているので、EOFException

ソリューション

ステップ1 - 比較的少数

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

ステップ2に、プールのサイズを制限 - あなたはFacebookのコードを使用する場合はいつでも再試行メカニズム

を実装し、EOFExceptionを取得例外をキャッチして最大プールサイズまでURLへの接続を再試行するtry-catchでラップします。ここで使用できるメソッドスタブは、(、私は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); ) 初めて。