如何处理WebViewClient.shouldInterceptRequest()中的IOException

时间:2016-01-22 10:56:57

标签: android android-webview httprequest ioexception

我试图拦截来自WebView的请求,以便我可以注入额外的标头。我将WebViewClient应用于WebView并覆盖shouldInterceptRequest()

shouldInterceptRequest()中,我打开连接,添加标题,然后在WebResourceResponse中返回打开的流。

如果初始打开连接失败,我不清楚应该如何处理IOException。

final Map<String, String> extraHeaders = getExtraHeaders(intent);
webview.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        final Uri uri = request.getUrl();

        try {
            URL           url = new URL(uri.toString());
            URLConnection con = url.openConnection();
            for (Map.Entry<String, String> h : extraHeaders.entrySet()) {
                con.addRequestProperty(h.getKey(), h.getValue());
            }
            final String contentType = con.getContentType().split(";")[0];
            final String encoding    = con.getContentEncoding();
            return new WebResourceResponse(contentType, encoding, con.getInputStream());
        } catch (IOException e) {
            // what should we do now?
            e.printStackTrace();
        }

        return super.shouldInterceptRequest(view, request);
    }
});

我无法保密,因为它是经过检查的例外,不属于shouldInterceptRequest()签名。

我无法将其包装在未经检查的异常中,因为WebView会将其删除并杀死该应用。

如果我捕获并忽略该异常,并默认使用super方法(只返回null),那么WebView将继续其默认行为并尝试发送请求(没有我的额外的标题)。这是不可取的,因为WebView自己的连接尝试实际上可能成功,并且缺少的标题将导致更多的问题。

似乎没有办法表明拦截失败,请求应该中止。

这里最好的事情是什么?

我试图返回模拟失败响应,但这不会被视为错误。 WebView显示包含响应内容的页面(来自异常的错误消息),并且不会调用WebViewClient的onReceivedError()onReceivedHttpError()回调。

} catch (IOException e) {
    InputStream is = new ByteArrayInputStream(e.getMessage().getBytes());
    return new WebResourceResponse("text/plain", "UTF-8", 500, "Intercept failed",
                                   Collections.<String, String>emptyMap(),
                                   is);
}

2 个答案:

答案 0 :(得分:1)

您可以尝试实例化新的WebResourceError,然后调用WebViewClient.onReceivedError。从未尝试过这样的事情,但这就是它的样子:

} catch (final IOException e) {
    WebResourceError wre = new WebResourceError(){
        @Override
        public CharSequence getDescription (){
            return e.toString(); 
        }

        @Override
        public int getErrorCode (){
            return WebViewClient.ERROR_CONNECT;
        }
    };

    onReceivedError(view, request, wre);

    return true;
}

如果您不想要或无法实例化WebResourceError,还可以使用deprecated version of onReceivedError

答案 1 :(得分:-1)

表示发生了某种I / O异常。此类是由失败或中断的I / O操作产生的一般异常类。

IOException的() 构造一个IOException,其中包含null作为其错误详细消息。

IOException(String message) 使用指定的详细消息构造IOException。

IOException(String message,Throwable cause) 使用指定的详细消息和原因构造一个IOException。

IOException(Throwable cause) 使用指定的cause和详细消息构造一个IOException(cause == null?null:cause.toString())(其中 可能包含原因的类和详细信息。

您有关于IOException的示例

这里:

http://examples.javacodegeeks.com/core-java/io/ioexception/java-io-ioexception-how-to-solve-ioexception/