在WebViewClient中覆盖shouldInterceptRequest时系统崩溃

23

目标:

覆盖WebView发出的所有请求,自己执行请求(最终设置代理)。

代码:

@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
    if (url == null || url.trim().equals(""))
        return null;

    final DefaultHttpClient httpClient = new DefaultHttpClient();
    httpClient.getConnectionManager().closeExpiredConnections();
    final HttpUriRequest httpRequest = new HttpGet(url);

    try {
        final HttpResponse response = httpClient.execute(httpRequest);
        final Header[] headers = response.getHeaders(CONTENT_TYPE);
        String mimeType = "";
        String encoding = "";
        if (headers != null && headers.length > 0) {
            final String type = headers[0].getValue();
            final int semicolonIndex = type.indexOf(';');
            if (semicolonIndex != -1) {
                mimeType = type.substring(0, semicolonIndex).trim();
                encoding = type.substring(semicolonIndex + 1).trim();
                final int equalsIndex = encoding.indexOf('=');
                if (equalsIndex != -1)
                    encoding = encoding.substring(equalsIndex + 1).trim();
            } else
                mimeType = type;
        }

        return new WebResourceResponse(mimeType, encoding, response.getEntity().getContent());
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } finally {
        httpClient.getConnectionManager().closeExpiredConnections();
    }
    return null;
}

所有请求似乎都可以正常进行,但最终我会得到一个堆栈跟踪,显示以下两个问题之一:

3 15:07:28.650 E/InputDispatcher( 3981): channel '40d76268 com.secure.browser/com.secure.browser.SecureBrowserActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
01-03 15:07:28.650 E/InputDispatcher( 3981): channel '40d76268 com.secure.browser/com.secure.browser.SecureBrowserActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

这显然表明操作系统已经用完了文件描述符(fid)

或者

01-03 15:29:36.810 I/DEBUG   ( 5798):     5903cd34  ac81c0b7  /system/lib/libdvm.so
01-03 15:29:38.380 I/DEBUG   ( 5798): debuggerd committing suicide to free the zombie!
01-03 15:29:38.380 I/BootReceiver( 3981): Copying /data/tombstones/tombstone_07 to DropBox 

(系统墓碑)

我认为这意味着操作系统遇到了低级问题。

我正在使用3.0+,因此应该支持该函数。

这通常在我打开JavaScript时失败,或者在没有JavaScript的情况下浏览一段时间后失败。


在你的catch块中都加入e.getSuppressed()。然后重新运行代码,并回复是否起作用。同时回答一下是否正在使用WAKE_LOCK - exploitr
1个回答

1
该方法已被弃用,请尝试使用相同方法的其他签名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接