• WebView中实现延迟加载,图片点击时才加载。


     1           String newHtml = html + 
     2                     "<script type="text/javascript">" +
     3                         "(function (){"+
     4                             "var imageList = document.getElementsByTagName("img");"+
     5                             "for(var i=0; i<imageList.length; i++){"+
     6                                 "var image = imageList[i];"+
     7                                 "image.href = image.src;"+
     8                                 "image.src = "content://com.example.demo/res/def.jpg";"+
     9                                 "image.alt = "点击加载图片";"+
    10                                 "image.onclick = function(){"+
    11                                     "this.src = this.href;" +
    12                                     "return false;"+
    13                                 "}"+
    14                             "}"+
    15                         "}());"+
    16                     "</script>";
    17        
    mWebView.getSettings().setJavaScriptEnabled(true);
    18        mWebView.loadData(newHtml, "text/html; charset=UTF-8", null);
    以上的代码是在获取到的html页面后面添加一个自动执行的js函数,把所有图片标签的地址替换为一个占位图,当图片被点击时再加载真实的图片。
    要加载应用自带的图片,我们可以用ContentProvider来实现。在com.example.demo.provider包目录下创建一个ContentProvider,重写openAssetFile方法来获取Assets文件夹里的占位图,然后在AndroidManifest.xml里注册ContentProvider。
     1   @Override
     2     public AssetFileDescriptor openAssetFile(Uri uri, String mode)
     3             throws FileNotFoundException {
     4         String fileName = uri.getLastPathSegment();
     5         try {
     6             return getContext().getAssets().openFd(fileName);
     7         } catch (IOException e) {
     8             e.printStackTrace();
     9             return super.openAssetFile(uri, mode);
    10         }
    11     }
    1     <provider 
    2             android:name="com.example.demo.database.ImageContentProvider"
    3             android:authorities="com.example.demo" />

    但是这个方法只能用在Android4.4以下的版本,4.4以后的版本换了WebView的内核后这个办法就无效了。所以我们可以用WebViewClient中一个API11开始提供的一个接口shouldInterceptRequest来实现拦截。

     1     public WebResourceResponse shouldInterceptRequest(WebView view,
     2                 String url) {
     3             WebResourceResponse response = null;
     4             if (url.contains("def.jpg")) {
     5                 try {
     6                     InputStream image = getAssets().open("def.jpg");
     7                     response = new WebResourceResponse("image/jpeg", "UTF-8", image);
     8                 } catch (IOException e) {
     9                     e.printStackTrace();
    10                 }        
    11             }
    12             return response;
    13         }

    最省事的话就是随便找个云储存,自己上传一张图片到上面。然后用这张图片的URL作为占位图,反正WebView会自动缓存数据,所以这张图片只会读取一次。

  • 相关阅读:
    暑假第二周总结
    7.18-7.24 第一周周报
    poj 3295 Tautology
    2016多校 #2 1006 Fantasia
    codeforces 698B Fix a Tree
    codeforces 699B Bomb
    HDU 4578(线段树
    CF 600F( 二分图
    hdu 5517 Triple(二维树状数组)
    HDU HDOJ5412(树套树or整体二分
  • 原文地址:https://www.cnblogs.com/zhengxt/p/4304625.html
Copyright © 2020-2023  润新知