51

新しい FaceBook SDK 3.0 を使用しています。URL から「me/photos」に画像を投稿しているときに、断続的にEOFException. たまにこのエラーが発生します (20 回に 1 回程度)。

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
4

2 に答える 2

1

問題

これはHttpURLConnection関連する問題です。接続に使用される実際のソケットは、プールから選択されます。ほとんどのサーバーConnection: Keep-Aliveは、毎回新しいソケットを作成するよりも安価な既存のソケットを再利用するために、永続的な接続 (ヘッダー) を作成します。問題は、これらのソケットが一定時間 (ほとんどの場合 60 秒程度) 開いていると、閉じられて再利用できないという事実から生じます。ただし、Android OS は、ソケットが同じホストに割り当てられているため、ソケットがまだ正常であると考えているため、同じソケットを使用しようとします。なんらかの回答を期待していましたが、もう開いていませんEOFException

ソリューション

ステップ 1 - プールのサイズを比較的小さい数に制限する

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

ステップ 2 - 再試行メカニズムを実装する

Facebook のコードを使用してEOFException. 使用できるメソッド スタブを次に示します ( 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
    }
} 

もちろん、connect(0);最初は retryNumber( ) を 0 にしてこのメ​​ソッドを呼び出す必要があります。

于 2016-02-18T21:27:55.707 に答える