iis服务器助手广告
返回顶部
首页 > 资讯 > 移动开发 >android H5本地缓存加载优化的实战
  • 371
分享到

android H5本地缓存加载优化的实战

2024-04-02 19:04:59 371人浏览 安东尼
摘要

2020年最后一周,正准备摸摸鱼回家过年,须不知“惊天阴谋”已在领导层酝酿。竖日,组长带着诡异的微笑向我走来: 组长: “快过年了,你回家路途遥远,要不要请两天假?” 我: “组长,

2020年最后一周,正准备摸摸鱼回家过年,须不知“惊天阴谋”已在领导层酝酿。竖日,组长带着诡异的微笑向我走来:

组长: “快过年了,你回家路途遥远,要不要请两天假?”

我: “组长,你真是我的知己,想我所想,思我所思,你这么一说我就不客气了,那我就请两天”

组长:“行,请假肯定没问题,我一向很照顾兄弟们!!”(那一刻,一股暖流心中而过,早已将这一年他对我的“压榨”抛之脑后)

“不过我还有个事跟你说下,回家前有个需求你得完成”

我:“what??? ,,,, TMD......”

组长:“需求是这样的:最近客户反应html加载有点慢,需要优化下,最好能做到秒开,,,,加油,我相信你”。

我:“不是这H5,加载慢那你前端的原因呀,你找我。。。我。。。”(组长已经远去)

带着沉重的心情开始研究优化,开始在WEBView 层做文章,开启缓存,预加载,一顿操作效果微乎其微。

然后开始打前端文件的注意,一般本地Html文件加载速度比通过Url的加载速度会快很多。于是去找前端要了一个本地文件放到项目里进行本地加载。果不其然,速度嗖嗖的,此时,尴尬的事情发生了,前端功能经常更新,如果放到项目里岂不是H5更新,我就得升级版本。且不说我得累死,估计这方案提到组长那,他得提刀来见了。 于是另辟蹊径,将通过接口下载HTMl文件,存在到手机本地,这样webView去加载手机本地文件即可。一弧诡异的微笑在脸上散开。

动手: 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 srcFileString, String zipFileString) throws Exception {
  //创建ZIP
  ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileString));
  //创建文件
  File file = new File(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本地缓存加载优化的实战的详细内容,更多关于android H5本地缓存加载优化的资料请关注编程网其它相关文章!

--结束END--

本文标题: android H5本地缓存加载优化的实战

本文链接: https://www.lsjlt.com/news/122773.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • android H5本地缓存加载优化的实战
    2020年最后一周,正准备摸摸鱼回家过年,须不知“惊天阴谋”已在领导层酝酿。竖日,组长带着诡异的微笑向我走来: 组长: “快过年了,你回家路途遥远,要不要请两天假?” 我: “组长,...
    99+
    2024-04-02
  • android中H5本地缓存加载优化的方法
    这篇文章主要介绍了android中H5本地缓存加载优化的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。动手: 1.用 filedownloader 去下载了Html压缩文...
    99+
    2023-06-14
  • webpack如何实现缓存优化、合并、懒加载
    这篇文章主要介绍webpack如何实现缓存优化、合并、懒加载,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!除了的webpack基本配置,还可以进一步添加配置,优化合并文件,加快编译速...
    99+
    2024-04-02
  • 如何优化Java中的缓存加载算法?
    Java中的缓存加载算法是一个非常重要的话题,因为缓存可以提高程序的性能和响应速度。在本文中,我们将讨论如何优化Java中的缓存加载算法,以提高程序的性能和响应速度。 一、什么是缓存加载算法? 缓存加载算法是一种用于提高程序性能的技术,它通...
    99+
    2023-09-27
    load 缓存 编程算法
  • AndroidWebView缓存机制优化加载慢问题
    目录一 、前言二 、WebView存在的性能问题2.1 H5 页面加载速度慢2.1.1 渲染速度慢2.1.2 页面资源加载缓慢2.2 耗费流量2.3 总结三 解决方案3.1 前端H5...
    99+
    2023-02-07
    Android WebView缓存机制 Android WebView
  • android中Glide实现加载图片保存至本地并加载回调监听
    Glide 加载图片使用到的两个记录Glide 加载图片保存至本地指定路径 Glide.with(context).load(imgUrl).asBitmap().toBytes().into(new SimpleTarget<...
    99+
    2023-05-30
    glide 加载 回调
  • Android本地数据存储Room实践和优化技巧
    目录导入依赖关键注解说明一、使用步骤二、类型转换器三、结合RxJavaRoom在SQLite基础上做了ORM封装,使用起来类似JPA,不需要写太多的sql。 导入依赖 //roomd...
    99+
    2023-05-17
    Android本地存储Room Android Room存储
  • LeetCode缓存加载太慢?Python教你如何优化!
    LeetCode是一个著名的面试题库,其中包含了许多经典的算法和数据结构题目。在LeetCode的题目中,有一些题目需要使用缓存来加速算法的执行速度。然而,在实际使用过程中,我们会发现LeetCode的缓存加载速度非常慢,这给我们的算法带...
    99+
    2023-08-27
    load leetcode 缓存
  • Swoole和Workerman对PHP与MySQL的数据本地缓存和远程缓存的优化方法
    随着互联网的发展,PHP和MySQL作为开发Web应用的主要工具,其性能和效率问题一直是开发者关注的焦点。为了提高性能,减轻数据库压力,开发者通常会采取数据缓存的方式来优化应用程序。本文将介绍使用Swoole和Workerman两个常用的P...
    99+
    2023-10-21
    swoole 缓存优化 Workerman
  • Android Fresco图片加载优化的方案
    目录优化背景数据记录优化方案注意事项优化背景 一般情况下,Fresco图片加载需使用SimpleDraweeView,这个控件并不能自动根据自身的尺寸按需加载图片,即一个 N×N ...
    99+
    2024-04-02
  • MyBatis的注解使用、ORM层优化方式(懒加载和缓存)
    目录Mybatis注解Mybatis对ORM层的优化缓存懒加载MyBatis缓存机制二级缓存Mybatis注解 查找 @Select( "SELECT * ...
    99+
    2024-04-02
  • 如何使用PHP开发缓存优化静态资源加载
    如何使用PHP开发缓存优化静态资源加载简介:在网页开发中,静态资源如图片、CSS样式表和JavaScript脚本文件等往往会占据大部分的加载时间。对于大型网站或者高并发访问的网站来说,如何优化静态资源的加载速度是一个重要的问题。本文将介绍如...
    99+
    2023-11-07
    PHP开发技巧 PHP缓存优化 静态资源加载
  • 如何使用PHP开发缓存优化图片加载速度
    如何使用PHP开发缓存优化图片加载速度随着互联网的快速发展,网页加载速度成为用户体验的重要因素之一。而图片加载速度是影响网页加载速度的重要因素之一。为了加速图片的加载,我们可以使用PHP开发缓存来优化图片加载速度。本文将介绍如何使用PHP开...
    99+
    2023-11-08
    图片加载 优化技巧 PHP缓存
  • 深度探析HTML缓存机制:优化网页加载速度
    HTML缓存机制解析:让网页加载速度更快,需要具体代码示例 摘要:在互联网时代,网页加载速度成为用户体验的重要指标。为了提高网页的加载速度,HTML缓存机制成为一种有效的优化方式。本文将详细解析HTML缓存机制的原理,并提供具体...
    99+
    2024-01-23
    加载速度 加速网页 HTML缓存机制
  • 浅谈Redis高并发缓存架构性能优化实战
    目录场景1: 中小型公司Redis缓存架构以及线上问题实战场景2: 大厂线上大规模商品缓存数据冷热分离实战场景3: 基于DCL机制解决热点缓存并发重建问题实战场景4: 突发性热点缓存...
    99+
    2024-04-02
  • Android二级缓存加载图片实现照片墙功能
    实现二级缓存加载图片的功能,在使用DiskLruCache时,需先在工程中添加名为libcore.io的包,并将DiskLruCache.Java文件放进去。DiskLruCache直接百度下载即可。在GridView的适配器中,为Imag...
    99+
    2023-05-31
    android 加载图片 照片墙
  • Redis与本地缓存的结合实现
    目录前言设计示例Redis懒加载缓存流程图代码示例优点缺点总结Redis结合本地缓存流程图代码示例优点缺点总结后记前言 我们开发中经常用到Redis作为缓存,将高频数据放在Redis...
    99+
    2024-04-02
  • Android项目中如何优化Bitmap的加载
    Android项目中如何优化Bitmap的加载?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一 . 高效加载 BitmapBitMapFactory 提供了四类方法: deco...
    99+
    2023-05-31
    android bitmap roi
  • 编程算法的挑战:如何优化缓存使用?
    在计算机领域,缓存是一种用于提高数据读取速度的技术。缓存可以将访问频繁的数据存储在快速的存储介质中,以提高访问速度。然而,缓存的使用也会带来一些挑战,特别是在编程算法中,如何优化缓存使用就成为了一个重要的问题。 本文将探讨如何在编程算法中...
    99+
    2023-07-02
    leetcode 编程算法 缓存
  • 如何在Java中实现高效的缓存加载和缓存管理?
    Java作为一门广泛应用于企业级应用的编程语言,在实现高效的缓存加载和缓存管理方面也有着非常出色的表现。本文将详细介绍如何在Java中实现高效的缓存加载和缓存管理。 一、什么是缓存? 缓存是指将计算出来的结果或者是需要频繁读取的数据存储在内...
    99+
    2023-09-27
    load 缓存 编程算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作