Android:ServerSocket.accept()随机冻结

时间:2011-08-20 15:02:40

标签: android serversocket

我有一个WebView,它是通过localhost上的ServerSocket从后台线程提供的。这非常有效,但有时后台线程会随机停止接受请求(“网页不可用”)。一段时间后,它再次工作而不做任何更改,也就是说,无需重新启动线程或套接字或再次调用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)。

1 个答案:

答案 0 :(得分: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;
    }
});