我的编程空间,编程开发者的网络收藏夹
学习永远不晚

android中H5本地缓存加载优化的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

android中H5本地缓存加载优化的方法

这篇文章主要介绍了android中H5本地缓存加载优化的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

动手: 1.用 filedownloader 去下载了Html压缩文件

  implementation 'com.liulishuo.filedownloader:library:1.7.7'

封装下载工具类:

public class FileDownloadUtils {public static FileDownloadUtils instance = null;public FileDownloadUtils() {}public static FileDownloadUtils getInstance() {  if (null == instance) {    instance = new FileDownloadUtils();  }  return instance;}public void startDownLoadFileSingle(String downLoadUri, String destinationUri,FileDownLoaderCallBack callBack) {    FileDownloader.getImpl().create(downLoadUri).setPath(destinationUri).setListener(fileDownloadListener(callBack)).start();}// 下载方法private FileDownloadListener fileDownloadListener(final FileDownLoaderCallBack callBack) {  return new FileDownloadListener() {    @Override    protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {      //等待,已经进入下载队列    }    @Override    protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {      //下载进度回调      if (callBack != null){        callBack.downLoadProgress(task,soFarBytes,totalBytes);      }    }    @Override    protected void completed(BaseDownloadTask task) {      //完成整个下载过程      if (callBack != null){        callBack.downLoadCompleted(task);      }    }    @Override    protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {      //暂停下载    }    @Override    protected void error(BaseDownloadTask task, Throwable e) {      //下载出现错误      if (callBack != null){        callBack.downLoadError(task,e);      }    }    @Override    protected void warn(BaseDownloadTask task) {      //在下载队列中(正在等待/正在下载)已经存在相同下载连接与相同存储路径的任务    }  };}  public interface FileDownLoaderCallBack {  //文件是否下载完成  void downLoadCompleted(BaseDownloadTask task);  //文件是否下载失败  void downLoadError(BaseDownloadTask task, Throwable e);  //文件下载进度  void downLoadProgress(BaseDownloadTask task, int soFarBytes, int totalBytes); }}

解压Zip文件

public class ZipUtils {  public static final String TAG = "ZIP";  public ZipUtils() {   }public static void UnZipFolder(String zipFileString, String outPathString) throws Exception {  ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));  ZipEntry zipEntry;  String szName = "";  while ((zipEntry = inZip.getNextEntry()) != null) {    szName = zipEntry.getName();    if (zipEntry.isDirectory()) {            szName = szName.substring(0, szName.length() - 1);      File folder = new File(outPathString + File.separator + szName);      folder.mkdirs();    } else {      Log.e(TAG, outPathString + File.separator + szName);      File file = new File(outPathString + File.separator + szName);      if (!file.exists()) {        Log.e(TAG, "Create the file:" + outPathString + File.separator + szName);        file.getParentFile().mkdirs();        file.createNewFile();      }      // 获取文件的输出流      FileOutputStream out = new FileOutputStream(file);      int len;      byte[] buffer = new byte[1024];      // 读取(字节)字节到缓冲区      while ((len = inZip.read(buffer)) != -1) {        // 从缓冲区(0)位置写入(字节)字节        out.write(buffer, 0, len);        out.flush();      }      out.close();    }  }  inZip.close();}public static void UnZipFolder(String zipFileString, String outPathString, String szName) throws Exception {  ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));  ZipEntry zipEntry;  while ((zipEntry = inZip.getNextEntry()) != null) {    //szName = zipEntry.getName();    if (zipEntry.isDirectory()) {      //获取部件的文件夹名      szName = szName.substring(0, szName.length() - 1);      File folder = new File(outPathString + File.separator + szName);      folder.mkdirs();    } else {      Log.e(TAG, outPathString + File.separator + szName);      File file = new File(outPathString + File.separator + szName);      if (!file.exists()) {        Log.e(TAG, "Create the file:" + outPathString + File.separator + szName);        file.getParentFile().mkdirs();        file.createNewFile();      }      // 获取文件的输出流      FileOutputStream out = new FileOutputStream(file);      int len;      byte[] buffer = new byte[1024];      // 读取(字节)字节到缓冲区      while ((len = inZip.read(buffer)) != -1) {        // 从缓冲区(0)位置写入(字节)字节        out.write(buffer, 0, len);        out.flush();      }      out.close();    }  }  inZip.close();}public static void ZipFolder(String class="lazy" data-srcFileString, String zipFileString) throws Exception {  //创建ZIP  ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileString));  //创建文件  File file = new File(class="lazy" data-srcFileString);  //压缩 // LogUtils.LOGE("---->"+file.getParent()+"==="+file.getAbsolutePath());  ZipFiles(file.getParent()+ File.separator, file.getName(), outZip);  //完成和关闭  outZip.finish();  outZip.close();}private static void ZipFiles(String folderString, String fileString, ZipOutputStream zipOutputSteam) throws Exception {  // LogUtils.LOGE("folderString:" + folderString + "\n" +"fileString:" + fileString + "\n==========================");  if (zipOutputSteam == null)    return;  File file = new File(folderString + fileString);  if (file.isFile()) {    ZipEntry zipEntry = new ZipEntry(fileString);    FileInputStream inputStream = new FileInputStream(file);    zipOutputSteam.putNextEntry(zipEntry);    int len;    byte[] buffer = new byte[4096];    while ((len = inputStream.read(buffer)) != -1) {      zipOutputSteam.write(buffer, 0, len);    }    zipOutputSteam.closeEntry();  } else {    //文件夹    String fileList[] = file.list();    //没有子文件和压缩    if (fileList.length <= 0) {      ZipEntry zipEntry = new ZipEntry(fileString + File.separator);      zipOutputSteam.putNextEntry(zipEntry);      zipOutputSteam.closeEntry();    }    //子文件和递归    for (int i = 0; i < fileList.length; i++) {      ZipFiles(folderString+fileString+"/", fileList[i], zipOutputSteam);    }  }}public static InputStream UpZip(String zipFileString, String fileString) throws Exception {  ZipFile zipFile = new ZipFile(zipFileString);  ZipEntry zipEntry = zipFile.getEntry(fileString);  return zipFile.getInputStream(zipEntry);}public static List<File> GetFileList(String zipFileString, boolean bContainFolder, boolean bContainFile) throws Exception {  List<File> fileList = new ArrayList<File>();  ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));  ZipEntry zipEntry;  String szName = "";  while ((zipEntry = inZip.getNextEntry()) != null) {    szName = zipEntry.getName();    if (zipEntry.isDirectory()) {      // 获取部件的文件夹名      szName = szName.substring(0, szName.length() - 1);      File folder = new File(szName);      if (bContainFolder) {        fileList.add(folder);      }    } else {      File file = new File(szName);      if (bContainFile) {        fileList.add(file);      }    }  }  inZip.close();  return fileList;}}

下载:

File file = new File(Constants.saveH5FilePath);    if (file.exists()) {      file.delete();    }    //开始下载ZIP压缩包    FileDownloadUtils.getInstance().startDownLoadFileSingle(bean.getUrl(), Constants.saveH5FilePath,        new FileDownloadUtils.FileDownLoaderCallBack() {          @Override          public void downLoadCompleted(BaseDownloadTask task) {            try {              //解压ZIP压缩包              ZipUtils.UnZipFolder(Constants.saveH5FilePath, Constants.unH5ZipPath);              PreferencesUtil.getInstance().saveParam("H5VersionName", H5VersionName);            } catch (Exception e) {              e.printStackTrace();            }          }          @Override          public void downLoadError(BaseDownloadTask task, Throwable e) {          }          @Override          public void downLoadProgress(BaseDownloadTask task, int soFarBytes, int totalBytes) {          }        });

webView 加载:

 mWebSe.loadUrl("file:"+ Constants.unH5ZipPath+"/index.html");

感谢你能够认真阅读完这篇文章,希望小编分享的“android中H5本地缓存加载优化的方法”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

android中H5本地缓存加载优化的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android中H5本地缓存加载优化的方法

这篇文章主要介绍了android中H5本地缓存加载优化的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。动手: 1.用 filedownloader 去下载了Html压缩文
2023-06-14

android异步加载图片并缓存到本地实现方法

在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出。针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载
2022-06-06

Swoole和Workerman对PHP与MySQL的数据本地缓存和远程缓存的优化方法

随着互联网的发展,PHP和MySQL作为开发Web应用的主要工具,其性能和效率问题一直是开发者关注的焦点。为了提高性能,减轻数据库压力,开发者通常会采取数据缓存的方式来优化应用程序。本文将介绍使用Swoole和Workerman两个常用的P
2023-10-21

Android编程使用缓存优化ListView的方法

本文实例讲述了Android编程使用缓存优化ListView的方法。分享给大家供大家参考,具体如下: ListView调用Adapter的getView方法获取每一个Item布局,将这些已经获得的Item布局放入缓存,将大大提高获取数据的效
2022-06-06

Android优化查询加载大数量的本地相册图片

一、概述讲解优化查询相册图片之前,我们先来看下PM提出的需求,PM的需求很简单,就是要做一个类似微信的本地相册图片查询控件,主要包含两个两部分:进入图片选择页面就要显示出手机中所有的照片,包括系统相册图片和其他目录下的所有图片,并按照时间倒
2022-06-06

Android中加载网络资源时的优化可使用(线程+缓存)解决

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决。下面提出一些优化: 1、采用线程池 2、内存缓存+文件缓存 3、内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4、对下
2022-06-06

android下载文件保存到本地的方法是什么

在Android中,可以使用以下代码将文件下载并保存到本地:1. 首先,需要在AndroidManifest.xml文件中添加以下权限:```xml```2. 然后,在代码中使用以下方法下载文件并保存到本地:```javaprivate v
2023-05-30

Android 中对于图片的内存优化方法

1. 对图片本身进行操作 尽量不要使用 setImageBitmap、setImageResource、 BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 decode 后,最终都是通过 Java
2022-06-06

Android加载大分辨率图片到手机内存中的实例方法

还原堆内存溢出的错误首先来还原一下堆内存溢出的错误。首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片。应用的布局很简单,一个Button一个ImageView,然后按照常规的方式,
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录