我在Android上使用WevView(KitKat)并且我试图覆盖shouldInterceptRequest()并创建我自己的HTTP请求 - 让我的应用程序而不是webview处理请求。
我的观点是解决webview的跨域限制,这可能不是一个好主意,但这是另一个问题。
当我将从HTTP请求接收的数据传递给shouldInterceptRequest()方法返回的WebResourceResponse对象时,出现了问题。在这一点上值得一提的是,它是我的第一个Android应用程序(不是从正确的任务开始,但是嘿)而且我对Android上的流知识有限。我觉得有一些同步问题kinf,也许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),但我遇到的错误似乎完全不同。
有什么想法吗?
感谢您的帮助!
答案 0 :(得分:1)
我有同样的问题。如果删除
urlConnection.disconnect();
它有效。所以原因必须是在检索内容之前关闭连接。我不确定为什么会发生这种情况,我的猜测是WebResourceResponse在流上做了一些懒惰的阅读。
我的解决方案只是'清洁'如果WebResourceResponse关闭了流本身,否则连接和流将无法关闭并泄漏资源。