我有一个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)。
答案 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;
}
});