VasSonic之流式拦截

VasSonic之流式拦截

VasSonic框架用到了流式拦截和增量更新技术,下面只简单介绍流式拦截,详细参考:https://github.com/Tencent/VasSonic/wiki

一)传统H5页面打开缓慢的原因?

1.打开一个H5页面首先需要初始化WebView内核和渲染组件(冷启动耗时200~500ms,冷启动过程中网络处于空等状态)
2.完成初始化后,WebView在CDN上请求Html页面,数据回来后再对DOM进行操作更新

二)Sonic框架如何优化Webview初始化过程中网络空等问题?

针对网络空闲问题,Sonic做了并行请求,通过Native建立http链接获取html数据,充分利用这段空闲时间。最理想的情况是html数据下载完成,Webview还没初始化好,等Webview初始化完成直接加载本地html;当Webview初始化完成,html还没下载完,这时就要提到流式拦截技术了

三)流式拦截如何实现?

将Html已读流(memStream)和未读流(netStream)桥接成SonicSessionStream,SonicSessionStream继承InputStream并重写read方法,SonicSessionStream包装成WebResourceResponse对象,通过webview拦截接口shouldInterceptRequest将WebResourceResponse回传给webview,SonicSessionStream代码如下:

public class SonicSessionStream extends InputStream{
  // 未加载HTML流
  private BufferedInputStream netStream;
  // 已加载HTML流
  private BufferedInputStream memStream;

  // 省略非关键代码
  @Override
  public synchronized int read() throws IOException {

    int c = -1;

    try {
      if (null != memStream && !memStreamReadComplete) {
        c = memStream.read();
      }

      if (-1 == c) {
        memStreamReadComplete = true;
        if (null != netStream && !netStreamReadComplete) {
          c = netStream.read();
          if (-1 != c) {
            outputStream.write(c);
          } else {
            netStreamReadComplete = true;
          }
        }
      }
    } catch (Throwable e) {
      Log.e(TAG, "read error:" + e.getMessage());
      if (e instanceof IOException) {
        throw e;
      } else {//Turn all exceptions to IO exceptions to prevent scenes that the kernel can not capture
        throw new IOException(e);
      }
    }

    return c;
  }
  // 省略非关键代码
}

在webview拦截接口shouldInterceptRequest中处理mSonicSessionStream,代码如下:

mWebView.setWebViewClient(new WebViewClient() {

      @Override
      public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        if (mMallHtmlStream != null && isInterceptByWebView.get() && isMatchCurrentUrl(url)) {
          String mime = MallHtmlUtils.getMime(url);
          return new WebResourceResponse(mime, "utf-8", mSonicSessionStream);
        }
        return super.shouldInterceptRequest(view, url);
      }
    });

核心思想是充分利用webview初始化的时间,由native建立http链接请求HTML资源,在webview初始化完成前,尽可能的多请求HTML数据,等webview完成初始化立即将HTML提供给Webview渲染。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chengyuan9160

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值