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会自动缓存数据,所以这张图片只会读取一次。

时间: 2024-12-10 01:27:29

WebView中实现延迟加载,图片点击时才加载。的相关文章

关于SpringMvc中js和图片路径正确但是不能加载的问题

SpringMvc中,在没有设置拦截特殊的请求时,会默认拦截所有请求,包括js和图片等静态请求,造成资源查询失败404错误(http://localhost:8080/SSHA/js/jquery.js Failed to load resource: the server responded with a status of 404 (Not Found)). 较好的解决方案是设置SpringMvc拦截特定请求,如设置只拦截以.do结尾的请求: 原文地址:https://www.cnblogs

Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)

列表的单元格中包含有图片在开发中很常见.通常我们可以直接在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)中给单元格设置图片. 但有时这些图片要从远程加载,或者要给图片作裁减,添加滤镜等操作.如果这些操作还是直接在主线程中进行,由于上下拖动表格滚动条的时候,单元格渲染是实时进行的.那么单元格便会不断地进行图片加载,渲染,影响效率造成卡顿.如果图片大的话还会浪费流量. 下面通过一个展示“热

用事件冒泡实现在div内点击,不触发事件,当在div外点击时才触发事件

讲解 http://caibaojian.com/javascript-stoppropagation-preventdefault.html 使用案例 在div内点击,不触发 一个事件,当在div外点击时才触发事件. 这比按钮节流和缓冲都要好的多 自己使用的是一个form控件中的输入不触发,当输入完点击其他地方时触发计算,将结果赋值给form中不可编辑的控件中. 具体代码: function div10_onClick(event) { //点击#Click时要阻止冒泡,否则.pop是不显示的

Fresco对Listview等快速滑动时停止加载

Fresco中在listview之类的快速滑动时停止加载,滑动停止后恢复加载: 1.设置图片请求是否开启 [java] view plain copy print? // 暂停图片请求 public static void imagePause() { Fresco.getImagePipeline().pause(); } // 恢复图片请求 public static void imageResume() { Fresco.getImagePipeline().resume(); } 2.设

界面存在多个easyUI Combobox控件时,加载数据失败,或加载不正确

问题原因:当一个界面上有多个easyui ComboBox控件,且在界面加载时同时请求数据.由于数据是异步加载,会导致下拉数据源加载失败,或加载不正确(串数据). 方案一:不用在一开始设定url(data加载路径),在点击控价下拉按钮时再加载数据源. <td>处理类型:</td> <td><input id="handleType" name="handleType" panelHeight="auto"

基于spring的web项目启动时预加载数据到ServletContext

1.要在web启动时预加载数据到ServletContext,实现方法有很多,一种比较简单的方案就是: 1)新建一个bean,定义其初始化方法: <bean id="beanId" init-method="初始化方法" />或者使用@PostConstruct注解到初始化方法上面 2)获取ServletContext实例对象,如何获取呢? 方法1: @Autowired private ServletContext application; 方法2:

仿腾讯新闻,点击屏幕重新加载的实现,直接贴代码

<pre class="java" name="code">package com.example.clicktoreload; import com.example.clicktoreload.ClickScreenToReload.Reload; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.view.M

selenium启动Chrome时,加载用户配置文件

selenium启动Chrome时,加载用户配置文件 Selenium操作浏览器是不加载任何配置的,网上找了半天,关于Firefox加载配置的多点,Chrome资料很少,下面是关于加载Chrome配置的方法: 一.加载所有Chrome配置 用Chrome地址栏输入chrome://version/,查看自己的“个人资料路径”,然后在浏览器启动时,调用这个配置文件,代码如下: #coding=utf-8 from selenium import webdriver option = webdriv

Tomcat启动时自动加载Servlet

1.想做一个服务启动时自动启动一不停止的获取订阅功能 2.之前是做一个Jsp页面请求servlet来触发方法 3.现在实现Tomcat启动时自动加载Servlet 1.Tomcat中启动Servlet时,只需要在Servlet所在的工程的配置文件web.xml中写成如下即可 <!-- 自动启动订阅接口 --> <servlet> <servlet-name>TimeServlet</servlet-name> <servlet-class>ser