IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 客户端FastHybird方案,提升webview页面打开速度 -> 正文阅读

[移动开发]客户端FastHybird方案,提升webview页面打开速度

前言

三种形式:Native页面、RN页面和h5页面,相当比前两种形式,h5有跨平台、开发成本低、迭代速度快优势,同时也有加速速度慢,性能不够理想的问题。为弥补h5的短板,最快最有效的是提升h5加载速度。

根据前端同事的调研,以下为h5页面加载过程耗时分析:
在这里插入图片描述

其中静态资源下载过程时间是最长的,而且根据h5的复杂程度还可能会更长,如果能提前把这些资源缓存好,并拦截WebView加载资源的过程,这将大大提交h5的打开速度。幸运的是Android的webview可以直接拦截下载资源。

public class DuWebViewClient extends WebViewClient {

    @Nullable
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        return super.shouldInterceptRequest(view, url);
    }
}

客户端方案

对于客户端来说,资源缓存主要包括两部分: h5资源下载,WebView资源拦截
在这里插入图片描述
在具体实现时还需要解决解决几个问题

  1. 提前缓存的资源哪里来?
  • 在远端创建一个配置文件,配置好需要提前缓存的资源url
  • 请求需要预加载的资源配置列表接口
  • 清空待下载的任务队列,防止重复和冗余请求
  • 在缓存中检查本地是否存在
  • 存在直接略过
  • 不存在放入下载队列
  1. 下载资源策略
  • 根据配置将资源分为几个优先级 priority
  • 特高 0: 不论前后台,不论网络情况立即下载
  • 高 1: 前台wifi条件下,或者后台不论网络环境下
  • 中 2: 后台,不论网络环境
  • 低 3: 后台wifi条件下
  • 在进入不同条件时,从待下载列队中取出下载任务进行下载
  • 下载完成后进资源进行校验
  • 检查规则暂定采用返回头里面的md5进行校验
  1. 资源存储到缓存,防止
  • 缓存采用LRUDiskCache,大小暂定50M,这样可以
  • 将下载的资源本身,及请求的Respone的header部分进行存储
  • 以资源的url作为惟一key进行保存,此时要保证当资源有修改时url也一定会修改
  1. WebView拦截资源
  • 重写WebViewClient的shouldInterceptRequest方法
  • 根据url查找本地是否存在缓存
  • 有缓存就取出缓存与header
  • header添加字段du_cached: [缓存时间戳],预留
  1. 埋点统计
  • 针对首次打开WebView页面的进行统计
  • 页面加载完毕后上传Apm

下载流程:

在这里插入图片描述

拦截流程
在这里插入图片描述

代码设计

代码框架设计
在这里插入图片描述

遵循高内聚,低偶合的原则,sdk对外主要暴露四个类,FastHybridApi与FastHybridConfig配置初始化,IFastHybridProxy用来代理WebView资源加载过程,而FastHybridResourceResponse单独封装利于我们转化成自己需要的对象。所以对于外外部使用来说,仅需要三步

  1. 根据需求初始化
FastHybridApi.init(context, FastHybridConfig(
                    appId = "du",
                    isDebug =  DuConfig.DEBUG,
                    configUrl = if (DuConfig.DEBUG) TEST_CONFIG_URL else RELEASE_CONFIG_URL ,
                    miniCheckTime = if (DuConfig.DEBUG) 0L else FhConstants.DEFAULT_MINE_CHECK_TIME
))
  1. 创建IFastHybridProxy, 其中setOnLoadCallBack是为了统计页面加载完成的时间
boolean isH5resourceLoad = ConfigCenterHelper.isEnable("h5resourceLoad", false);
fastHybridProxy = FastHybridApi.INSTANCE.createProxy(loadUrl, isH5resourceLoad);
fastHybridProxy.setOnLoadCallBack((url, timeSpent, isCacheOpen, isCacheResource,
                                           isFirstLoad, cachedResources) ->{
            if (isCacheResource && isFirstLoad){
                FhLogger.INSTANCE.d("onLoad upload to apm...");
                Map<String, String> map = new HashMap<>();
                map.put("url", url);
                map.put("cost", String.valueOf(timeSpent));
                ApmBiClient.monitorMap("other",
                        isCacheOpen && isH5resourceLoad ? "h5_resource_load" : "h5_resource_load_2",
                        map, 1f);
            }
} );
  1. 代理WebView的加载过程

private DuWebViewClient webViewClient = new DuWebViewClient() {

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            if (fastHybridProxy != null) {
                fastHybridProxy.onPageStarted(url);
            }
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            onPageLoadFinish(view, url);
            if (fastHybridProxy != null){
                fastHybridProxy.onPageFinish(url);
            }
        }

        @Nullable
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            FastHybridResourceResponse resourceResponse =  fastHybridProxy != null ?
                    fastHybridProxy.shouldInterceptRequest(request) : null;
            return resourceResponse != null ? resourceResponse.toWebResource()
                    : super.shouldInterceptRequest(webview, request);
        }

        @Nullable
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            FastHybridResourceResponse response = fastHybridProxy != null ?
                    fastHybridProxy.shouldInterceptRequest(url) : null;
            return response != null ? response.toWebResource() : null;
        }
    };
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:37:23  更:2021-10-23 12:38:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:44:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码