无法覆盖shouldInterceptRequest()以发出我自己的HTTP请求

时间:2014-03-05 17:05:13

标签: android webview

我在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),但我遇到的错误似乎完全不同。

有什么想法吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我有同样的问题。如果删除

urlConnection.disconnect();

它有效。所以原因必须是在检索内容之前关闭连接。我不确定为什么会发生这种情况,我的猜测是WebResourceResponse在流上做了一些懒惰的阅读。

我的解决方案只是'清洁'如果WebResourceResponse关闭了流本身,否则连接和流将无法关闭并泄漏资源。