shouldInterceptRequest

shouldInterceptRequest

我正在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关闭流本身的情况下才是“干净的”,否则连接和流将不会关闭并且不会泄漏资源。

08-06 10:55