我正在Android(KitKat)上使用WevView,并且尝试覆盖shouldInterceptRequest()并发出自己的HTTP请求-由我的应用而不是由Webview处理请求。
我的观点是解决Web视图的跨域限制,这可能不是一个好主意,但这是另一个问题。
当我将从HTTP请求接收的数据传递给shouldInterceptRequest()方法返回的WebResourceResponse对象时,出现了问题。在这一点上,值得一提的是,这是我的第一个Android应用程序(不是从正确的任务开始,而是嘿),而且我对Android流的了解有限。我觉得有一些同步问题,也许Webview期望缓冲的数据和我的InputStream被缓冲?无论如何,尽管在不同的论坛上四处逛逛,但我仍然无法理解问题所在。
我的代码如下所示:
mWebView.setWebViewClient( new WebViewClient()
{
public WebResourceResponse shouldInterceptRequest(WebView _view, String _url)
{
URL url;
try {
url = new URL(_url);
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
HttpURLConnection urlConnection;
try {
urlConnection = (HttpURLConnection) url.openConnection();
} catch (IOException e) {
e.printStackTrace();
return null;
}
WebResourceResponse response = null;
try {
response = new WebResourceResponse( urlConnection.getContentType(),
urlConnection.getContentEncoding(),
urlConnection.getInputStream() );
} catch (IOException e) {
e.printStackTrace();
} finally {
urlConnection.disconnect();
}
return response;
}
});
当我运行测试应用程序时,它崩溃了。 Logcat给了我以下日志:
W/System.err(4527): java.io.IOException: stream closed
W/System.err(4527): at com.android.okhttp.internal.http.AbstractHttpInputStream.checkNotClosed(AbstractHttpInputStream.java:68)
W/System.err(4527): at com.android.okhttp.internal.http.HttpTransport$ChunkedInputStream.available(HttpTransport.java:476)
W/System.err(4527): at dalvik.system.NativeStart.run(Native Method)
A/libc(4527): Fatal signal 6 (SIGABRT) at 0x000011af (code=-6), thread 4551 (example.webtest)
I/chromium(4527): [INFO:async_pixel_transfer_manager_android.cc(56)] Async pixel transfers not supported
我看到有人试图做类似的事情(System Crash When Overriding shouldInterceptRequest in WebViewClient),但我遇到的错误似乎完全不同。
有任何想法吗?
谢谢你的帮助!
最佳答案
我遇到过同样的问题。如果删除urlConnection.disconnect();
有用。因此,原因一定是在检索内容之前关闭了连接。但是我不确定为什么会发生这种情况,我想WebResourceResponse会在流上进行一些懒惰的阅读。
我的解决方案只有在WebResourceResponse关闭流本身的情况下才是“干净的”,否则连接和流将不会关闭并且不会泄漏资源。