0

我有一个WebView通过ServerSocket本地主机上的后台线程提供的。这很好用,但有时后台线程会随机停止接受请求(“网页不可用”)。一段时间后,它再次工作而没有任何变化,即无需重新启动线程或套接字或accept()再次调用。

编辑2:进一步调查表明,WebView似乎有一个(单独的?)本地主机连接的超时值非常小,以至于有时服务器线程没有机会处理请求。作为一种解决方法,我可以在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(三星 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 回答