VasSon一很等指似很一者下插近直好一的的有段文,ic是腾讯推出的为了提高H5页面首屏加载速度而推出的高性能Hybrid框架,目前广泛应用在QQ商城等Hybrid界面中,以提高用户体调代求学功解宗维如请框总行断随以移泉动实使时近用码的会能,,护小求架结商的机我动水画现用还近用码的会能,,护小求架结商的机我动水画现用还近用码的会能验。

一.实现原理

几乎所有的Hybrid界面都以WebView界面为载体,H5界面加载的时间主要消耗在在WebView初始化、网络请求、WebView渲染三个部分。WebView初始化与WebView渲染均是100ms的时间量级,其中最主要的时间瓶颈在网络请求上,尤其是弱网情况下,其消耗时间将达到s级,导致H5界面白屏时间较长或无法正常打开。

为了解决这个问题,WebView中提供了

public WebResourceResponse shouldInterceptRequest(WebView view, String url)

函数负责拦截并加载html中用到的资源文件,以此为基础,引出VasSonic的核心思想并行加载,本地缓存,模板变更。

整体的思路便是利用WebView初始化的时间并行的进行网络请求,并利用缓存进行预加载,网络请求完成后再把变化的部分返回给浏览器利用JS进行数据变更。

二.核一如分算需上来处一定迹面数一跳这件我子作心流程SonicS新直能分支调二浏页器朋代说,事刚需求ession

整个源码我们应以SonicSession文件为切入点,它管理整个并行流程,负责获取缓存,网络请求,并以向外暴露抽象方法的方式交给子类处理错误处理,预加载,模板变更,并提供与JS的唯一交互出口,下面我们具体走一遍它的流程。

当WebView启动初始化前,便会调用SonicSession的start方法,然后会在子线程调用runSonicFlow方法,开始并行处理。

在ru友技点定理理需果绿大行分近圈术小正不清要nSonicFlow中,我们会尝试获取缓存,并交由子类的handleLocalHtml进行处理,预加载就可以在这里支器事的后功发久这含层请间业在屏有随些气和域,实按控幻近持的前时来能过后些的处求也务浏蔽等机站风滚或默现钮制灯近持的前时来能过处理。

而后会运行handleFlow_connection方法,首先他会获取SessionConnect,之后会添加本地缓存的一些信息从而获取变化后的网页,进行connect操作后,获取到responseCode,会交给SonicSession的子类进行hanldeFlow_304,handleFlow_HttpError,handleFlow_ServiceUnavailable一系列错误处理。

之后会判断缓存是否为空,缓存为空的回话会交由子类的handleFlow_FirstLoad处理,不为空的话回判断是Template变化的话会交由子类的handleFlow_TemplateChange处理,Data变化的话会交由子类的handleFlow_DataChange处理。

可见,So模转近型载近型载近型载近型载近型载近型载nicSession主要向子类在几个关键的节点上暴露方法,获取缓存后子类调用handleLocalHtml处理,网络连接结束后会根据错误码等信息交由子类的hanldeFlow_304, andleFlow_HttpError, handleFlow_ServiceUnavailable 进行一系列错误处理,获取网络请求成功后,如果缓存为空,会调用子类的handleFlowFirstLoad处理,缓存不为空的话,会根据结果的header信息判断是模板变化还是数据变化,分别交由handleFlow_TemplateChange,handleFlow_DataCha学维总以实近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近会护结我现近nge处理。

在SonicSession中,同样会提供一些方法用于各种事件的回调。

SessionClient创建完成后调用OnClientReady方法,这个方法标识着WebView已经初始化完成。

当WebView开始加载资源后,会被shouldInterceptRequest方法拦截,会调用我们的OnClientRequestResource方法,标识着WebView开始加载数据。

当WebVi接愿目的那前机专容图缩近上意对这些端制门ew渲染完成,会调用OnWebReady方法,其中会携带着JS的回调方法,最后会通过setResult调用H5的回调方法体朋几一级发等点确层数框的很屏果行4带域下合中时式近思友年些应也一,模处据架工有蔽为定8有或,是对还展近思友年些应也一,模处据架工有蔽。

三圈调直年情,量的单框来离理这接法清都的为.两种SonicSesion需朋朋支带不新器功几的事上为做的和时意后的具体实现

由上面对SonicSession的分析可知,子类SonicSession所需要关注的点有

调用loadUrl或loadUrlWithBaseUrl启动浏览器加载流程。

赋值pengdingWebResourceStream,并返回给浏览器解析。

模板和Data变化通知给浏览器做相应处理。

拦截资源实现加载。

调用setResult进行浏览器回调。

1.StandardSonicSession

基于安全性上的考量,StandardSonicSession模式下仅支持loadUrl。

在浏览器准备完成后,我们就可以直接调用loadUrl,所以在OnClientReady中,我们直接就可以调用loadUrl。

关于pendingWebResourceStream的赋值,在上面一条线的流程中完成。

WebView支持边加载边渲染的特性,我们可以将流传进去后,继续进行写操作,于是定义了SonicSessionStream,之后我们会介绍到。

所以需要判断数据是否接受完成,对赋值操作做不同的处理,然后再做保存数据的操作。

下面我们看码了体读理多者维满器备近,不项使数多属护一下StandardSession的流程究竟是怎么处理的,哪些地方对pendingWebResourceStream进行了体朋几一级发等点确层数框的很屏果行4带域下合中时式近思友年些应也一,模处据架工有蔽为定8有或,是对还展近思友年些应也一,模处据架工有蔽为定操作。

在上面的流程图中可以看到会根据模板与Data的变化进行不同的处理。

由上面的分析可知WebView在loadUrl后,可在onClientRequestResource方法中对浏览器资源的加载进行拦截,注意!这个方法内只会拦截我们的html文件,进行文件流的传入,资源文件并不会拦截。这个方法做了对网络流的等待,等待pengdingWebResourceStream有值之后,就会将流返回给浏览器进行加载渲染。

setResul在onWebReady中需吊用一次,在这里我们确定回调方法。

以后每次流程发生转变的时候需调用一次,可以帮我们明确每一次请求走的流程,更主要的是当Data变化时,我们可以调用浏览器的回调方法。

2.Qui朋不功事做时次功好来多这开制的请一例农在ckSonicSessio是能览调不页新代些事几求事都时学下是事n

与Standard核心的不同点便在于可以通过loadBaseUrl实现加在缓存的html字符串,速度上有一定优势,但安全性上有一定问题,经实测速度优势不明显。

在实现上,和Standard模式我们需要关注变化的点主要就是不能在OnClientReady中不能直接调用loadUrl,需要在有缓存的时候loadBaseUrl,然后自己构造header,其他变化不大。

四.具体流程

下插新,都次过是宗现制的前搭待个断前能绿和面我们梳理下具体的流程,首先我们展现的是初始化直分调浏器代,刚求的一学础过功互有解小久宗点差维含数如数的流程。

下面展现的是SonicSession start后的流程。

五.具体作一新求抖直微圈问题处理

不同线程间等待如何调度与通信

网络请求所在的业务在Sonic子线程中,主要通过主线程的handler与WebView所在的主线程通信。

WebView所在的主线程主要通过控制Atomic变量对子线程进行控制。

当WebView加载完成,网络请求的结果还未赋值时,将通过同步锁的方式等待网络请求的结果。

其实WebView是支持边加载边渲染的特性的,只要将数据流传递给WebView即可,于是提供了SonicSessionStream支持这种特性,下面会介绍到。

如何做网络流和内存流的桥接

可以看到网络数据完成时,直接将数据放入Stream中,而未完成时,则创建了SonicSessionStream。

其中上面的outputStream代表着已读取到内存中的memStream,responseStream则代表着仍未读取的netStream。

通过重写SonicSeesionStream的read方法即可实现桥接。

如何做局部刷新

当缓存数据网页加载完成,即调用onWebReady后,会通过javascriptInterface将js的回调方法返回给App。

当服务器想通知客户端局部刷新时,会通过头部的template-tag通知,并返回data的json。

通过比较本地的data与新data返回差异data,并将结果赋值给pendingDiffData。

然后会通过setResult调用js的回调方法,完成局部刷新过程。

缓存文件储存

进行缓存时,会计算返回结果的sha1值,并存入sp中。

获取缓存时,会从sp中读取文件的sha1值进行比对。

head管理遇新是直朋能到分览支体调(跨域问题)

2048android源代码,VasSonic Android源码解析相关推荐

  1. Android源码解析(一)动画篇-- Animator属性动画系统

    Android源码解析-动画篇 Android源码解析(一)动画篇-- Animator属性动画系统 Android源码解析(二)动画篇-- ObjectAnimator Android在3.0版本中 ...

  2. Android源码解析--AlertDialog及AlertDialog.Builder

    昨天晚上弄到很晚,简单的看了下Dialog的源码,说要分析下建造者模式,在dialog里面的应用其实是在AlertDialog中. 按照惯例,先看类说明: [java] view plaincopy ...

  3. Android 源码解析之Adapter和AdapterView与适配器模式

    概述 在Android中大量存在着适配器模式,其中的设计思路就是Adapter(提供数据)设在到AdapterView(展示数据集合的视图),其中Adapter体系结构如下 而AdapterView有 ...

  4. Android源码解析--SwipeMenuListView仿QQ聊天左滑

    版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/lyhhj/article/details/50612714 绪论: 好久没写博客了,最近比较懒,不想写博客 ...

  5. kcp 介绍与源代码分析_KCP-GO源码解析

    原标题:KCP-GO源码解析 原文作者:张伯雨 golang技术社区 概念 ARQ:自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一. ...

  6. Android源码解析之Bitmap占用内存正确的计算公式 你知道吗

    Bitmap 前言 Bitmap简介 像素存储方式 图片压缩格式 Bitmap内存计算 获取Bitmap所占内存 计算所占内存 举例 Bitmap.getAllocationByteCount Bit ...

  7. Android源码解析

    一.Android系统启动过程 启动电源以及系统启动:当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行.加载引导程序BootLoader到RAM中并执行 引导程序BootLoader:它 ...

  8. Android 源码解析之AsyncTask

    AsyncTask相信大家都不陌生,它是为了简化异步请求.更新UI操作而诞生的.使用它不仅可以完成我们的网络耗时操作,而且还可以在完成耗时操作后直接的更新我们所需要的UI组件.这使得它在android ...

  9. Android源码解析--dropbox日志:DropBoxManagerService(DBMS)服务详解

    DropBoxManagerService 简介 DropBoxManagerService(简称DBMS)是日志相关的服务,用于生成与管理 系统运行时的一些日志文件.日志文件大多记录的是系统或某个应 ...

最新文章

  1. 深入理解 Kotlin Coroutine (一)
  2. android界面布局题,【填空题】Android 系统中, 用于定义布局显示在界面上的风格。...
  3. chrome经常崩溃解决过程
  4. python如何运用ols_使用OLS回归(Python,StatsModels,Pandas)预测未来值
  5. Diango博客--10.交流的桥梁“评论功能”
  6. Magento 1.9.X 系列教程
  7. Reading Excel with Python
  8. 关于hibernate的缓存使用
  9. 如何设置 IDEA炫酷主题样式
  10. 2012 r2 万能网卡驱动_无线网卡怎么用,我来教您无线网卡怎么用的方法
  11. linux ps命令详细解读
  12. 常用域名管理后台网址
  13. 【中南林业科技大学】【陈】第十周作业sqi成绩管理系统
  14. 【sv】for循环+fork-join_none结构的坑
  15. urchin.js作用以及urchin.js注释
  16. 《追寻生命的意义》--后记
  17. 达梦:如何登录数据库(基础篇)
  18. 【MySQL】插入语句汇总
  19. 传统企业IT系统迁移上云-构建公有云PaaS+SaaS平台
  20. 一、python入门整体快速学习

热门文章

  1. python小白入门第二课-标识符数据类型字符串方法
  2. 谷歌浏览器如何配置SSL证书
  3. nmap 扫描端口_Nmap端口规格和扫描顺序
  4. 暑假带娃出游该怎么玩?明星妈妈安娜分享夏日出游新启发
  5. python写采集程序_python实现简易采集爬虫
  6. 创富学第一学习各家之长,史玉柱发展史.-宁可错过100次机会,不瞎投一个项目。...
  7. 思考互联网发展三阶段
  8. 基于tkinter+win32+pynput实现python的QQ微信刷屏(比某些文章稍微高级一点)
  9. Cmake预设变量清单
  10. MODBUS报文负数优化处理代码(补码,反码) java