H5 容器资源拦截

App 页面里图片展示过多,加载速度缓慢,需要优化 H5 容器的加载速度,争取实现 H5 页面秒开。通过拦截替换 H5 容器中加载的资源文件,替换成下载好的本地文件,无需网上加载,即可大大提升 H5 页面的打开效率。以下方法实现为 Demo 代码,仅供参考。

  1. 继承 H5 容器提供的 H5ResProvider 类,并重写 containsgetResource 方法。

    //return true 拦截(取本地资源),false 不拦截(网络加载)
     @Override
     public boolean contains(String sourceUrl) {
         if (isCache(sourceUrl)) {
             if (ResourceCache.contains(sourceUrl)) {
                 LoggerFactory.getTraceLogger().debug(TAG, "contains: " + sourceUrl);
                 //不拦截
                 return true;
             } else {
                 ResourceCache.download(sourceUrl);
                 return false;
             }
         }
         return false;
     }
    @Override
     public InputStream getResource(String sourceUrl) {
         //从本地缓存中获取资源
         if (isCache(sourceUrl)) {
             if (ResourceCache.contains(sourceUrl)) {
                 try {
                     InputStream inputStream = ResourceCache.getResource(sourceUrl);
                     if (null == inputStream) {
                         LoggerFactory.getTraceLogger().debug(TAG, "File null: " + sourceUrl);
                         return new URL(sourceUrl).openStream();
                     }
                     LoggerFactory.getTraceLogger().debug(TAG, "getResource: " + sourceUrl);
                     return inputStream;
                 } catch (Exception e) {
                 }
             }
         } else {
             //从网络链接获资源
             try {
                 return new URL(sourceUrl).openStream();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
         return null;
     }
  2. 注册 H5ResProvider

    public static void register() {
         H5Utils.setProvider(H5ResProvider.class.getName(), new GapResProvider());
    }

通过自定义 H5ResProvider,用户可以决定是否拦截加载的资源和资源获取方式(本地读取、网络链接读取),用户可自定义实现自己的业务场景。