在WebView中获取有关图像/脚本/其他文件的信息

时间:2014-08-25 10:11:36

标签: android webview

我想问一下,是否有可能检查WebView中包含的某些数据的文件大小。

假设我加载的网页包含少量图片,少量JavaScript文件等。

现在我需要做的是获取这些文件的大小(以字节为单位)。

如果我理解正确,那些文件应该在缓存中下载,因此它们存在。我想避免的是重新下载这些文件只是为了获得它们的大小(我可以手动解析HTML并逐个重新下载)。

这可能吗?还是其他任何方式?我真的不关心显示页面,它会在后台发生,我需要的是关于网页中包含的文件的数据。

3 个答案:

答案 0 :(得分:0)

不是100%肯定,但我认为这可能有效:

为您的WebView创建一个WebViewClient实现,在实现中重写方法:“ShouldInterceptRequest”,或方法“ShouldOverrideUrlLoading”。 这些函数(尤其是第一个函数)为您提供webview尝试加载的任何资源的URL(包括图像和脚本)。 保留这些网址的列表,并确保返回Null作为该功能的结果,因此webview将照常继续加载页面。 最后,您将获得页面所需的所有资源的URL的最终列表(包括在ajax中加载的内容以及从其他URL内部加载的内容) - 然后您可以使用HTTPConnection或列表下载列表中的所有内容。无论如何,并知道尺寸。

答案 1 :(得分:0)

您可以使用" HEAD"获取任何网址的标题(包括内容长度)。 http请求方法。通过这种方式,除标题外不会下载任何数据。

使用setRequestMethod("HEAD")来做到这一点 例如:

HttpURLConnection connection;
String url = "http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=3c6263c3453b";
try {
    connection = (HttpURLConnection) ( new URL(url)).openConnection();
    connection.setRequestMethod("HEAD");
    connection.connect();
    String contentLength = connection.getHeaderField("Content-Length");
    Toast.makeText(getBaseContext(), contentLength, Toast.LENGTH_LONG).show();

} catch (ProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

答案 2 :(得分:0)

希望它对你有所帮助。祝你好运!

根据我的经验,我会这样做:当有一些资源需要加载/请求时,WebKit会通知*客户端。因此,您可以将URL保存在" onLoadResource"中,并在" shouldInterceptRequest"中检查它们的请求,以查看是否存在重复项。您只需返回一个空的WebResourceResponse即可避免数据加载。

e.g:

// webView is an instance of android.webkit.WebView
webView.setWebViewClient(mWebViewClient);


private WebViewClient mWebViewClient = new WebViewClient() {

        /**
         * Notify the host application of a resource request and allow the application
         * to return the data. 
         * If the return value is null, the WebView will continue to load the resource
         * as usual. 
         * Otherwise, the return response and data will be used. 
         * 
         * NOTE: This method is called by the network thread so clients should 
         *       exercise caution when accessing private data.
         * 
         * */
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
              ...  
              if (duplicate)
                  return NullWebResourceResponse(); 

              return null;
        }  

        /*
         * Notify the host application that the WebView will load the resource 
         * specified by the given url.
         */
        @Override
        public void onLoadResource(WebView view, String url) {
            //Log.d(LOGTAG, view.getClass().getSimpleName() + " - loading(" + url + ")...");
        };

    };