0

localhostをWebView介してバックグラウンド スレッドから供給される があります。ServerSocketこれは非常にうまく機能しますが、バックグラウンド スレッドがランダムにリクエストの受け入れを停止することがあります (「Web ページが利用できません」)。しばらくすると、変更なしで、つまり、スレッドまたはソケットを再起動したり、再度呼び出したりすることなく、accept()再び機能します。

編集 2:さらに調査したところWebView、localhost 接続の (別の?) タイムアウト値が非常に小さいため、サーバー スレッドが要求を処理する機会が得られない場合があることがわかりました。WebClient.onReceivedError回避策として、が呼び出されたときにページをリロードすると、最終的にページが読み込まれます。同じ問題を抱えている人はいますか?

デバッガーを開くと、サーバー スレッドがまだ適切に実行されており、ServerSocket.accept()メソッド (より正確には) で待機 (ブロック) されていることがわかりますOSNetworkSystem.accept(...)。ただし、accept()着信要求を受信して​​いないようです。

私のコードには特別なことは何もありません:

ServerSocket serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(0);

while (!shutdown) {
    Socket socket = null;
    try {
        socket = serverSocket.accept();
        // Parse request and create response
    } catch (Exception e) {
        // ...
    } finally {
        // ... close socket
    }
}

Windows/Mac で同じコードを使用していますが、そのような問題は経験したことがありません。

これはおそらく電源管理の最適化に関連する Android のバグのように思えます。手がかりはありますか?

編集:この問題は Android 2.x では発生せず、Android 3.1 (Samsung Galaxy Tab 10.1) でのみ発生します。

4

1 に答える 1

0

この問題は Android のバグです。

http://code.google.com/p/android/issues/detail?id=19427でバグレポートを提出しました

編集:回避策として、接続エラーが発生するたびにページをリロードするコードを追加しました。これはこれまでのところ非常にうまく機能しています。

webView.setWebViewClient(new WebViewClient(){
    String prevFailingUrl;
    int retryCount;
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        if (errorCode == WebViewClient.ERROR_CONNECT) {
            if (failingUrl.equals(prevFailingUrl)) {
                retryCount++;
            } else {
                retryCount = 1;
            }
            if (retryCount <= 3) {
                webView.reload();
            }
        }
        prevFailingUrl = failingUrl;
    }
});
于 2011-08-21T23:31:41.043 に答える