Webview加载本地图片的方案对比

本文探讨了在Android中使用WebView加载本地图片的各种方案,包括直接设置路径、Base64编码以及利用shouldInterceptRequest方法。针对性能和兼容性问题,提出了结合多线程、图片压缩和缓存的优化策略,通过对比分析,推荐了第四种方案,即压缩+缓存+流,以实现高效且流畅的图片加载体验。
摘要由CSDN通过智能技术生成

前言

先讲讲为什么会有这篇blog,话说前几天做个模块,要求是这样的:
做一个webview的页面,功能类似于微信发朋友圈一样,要求能上传本地图片到webview中进行展示,并按用户喜好添加和删除,当用户点击发布的时候,将这些图片上传至阿里云oss,收到oss响应后封装页面信息提交给服务器

技术要点

  1. webview与native的交互
  2. webview显示客户端本地图片的方式
  3. webview加载大量图片的问题(优化方案)
  4. 自定义关于webview的缓存系统

webview与native的交互

关于交互其实网上有很多文章,在之前我也写过一篇关于webview与native交互方案的blog: Android混合开发的入门和方案
因此在这个demo中我采用的也是JsBridge的方式来让webview与native进行通信,所以主要提一下其中一些坑:

  1. 使用JsBridge的方式,在子线程是无法发送消息给WebView的
  2. 如果webview要加载本地文件,必须设置mWebView.getSettings().setAllowFileAccess(true);
  3. 如果html文件存在于服务器中,就算你按照第二点设置了,那webview也无法读取本地文件,会报not allowed to load local resource(解决办法后面我会给出),这个坑异常深!!!
  4. 使用base64编码来让webview中img便签加载编码后的图片的异常(大坑)

webview显示客户端本地图片的方式

直接设置

拿到本地文件的路径,然后拼装便签,设置其src属性为”file://”+路径,webview就会自动去找此地址(“file://”是属性webview的一种协议,就像我们的http协议的道理)

    //imgPaths是我们选择的那些图片的本地路径
    private void adapterH5Data(List<String> imgPaths){
        String result = "";
        //拼装标签
        for(int i=0;i<imgPaths.size();i++){
            result += "<img src=\"file://"+imgPaths.get(i)+"\" height=\"70\" width=\"70\"/>";
        }
        //发送给webview容器
        mWebView.callHandler("adapter",result,null);
    }

那么在我们的html文件中,有一个这样的方法:

    function adapter(pars){
   
            //直接把native拼装好的html添加到id为info_img的便签里面
            $("#info_img").prepend(pars);
    }

Base64编码

base64编码大家应该都有接触过,还记得宝宝当年刚撸项目的时候,图片上传就是利用app把图片转化为base64,然后把这段字符串发送给服务器接收再进行解码,差点把老师气吐血。
那么这个方案,就是把目标路径的文件,通过base64编码编写成字符串,然后设置到img便签的src属性,这样img便可以显示出图片。

    
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值