VasSonic截断读流的再一次理解

昨天在猫眼android组内分享了一个腾讯的VasSonic框架(加快webview首屏加载速度)。讲到其中webview截断流后进行部分加载时,一个组员抛出来这么一个问题:

  “既然webview可以边读边解析,那么可以先给它一半的数据,webview可以先渲染一部分界面,展示出来,再给它另一半的数据”。
  “既然这样的话,我们目前项目中webview数据加载成功后取消loading标志
  的时机是不是可以提前?因为webview边加载边渲染,可能在全部数据加载完成之前,已经有部分页面加载成功了。”

回答这个问题前,我们详细梳理下webview加载流的过程。
一般情况下,webview.load(url)后
->
从后台获取节点流inputSream
(建立连接后,注意这时候connection.getResponse()获取inputstream节点流并不会阻塞,当从inputstream节点流中读取数据时,即inputStream.read()一个字节一个字节读时,获取了下一个字节后,才会返回,不然会阻塞。inputStram.read(buffer)内部也是调用的inputStream.read())
->
webview拿到这个节点流后,read()这个节点流,读的时候会阻塞(上面说了),边读边解析这个界面。当然你也可以把这个节点流全部读到一个内存中或缓存中,把这个内存或缓存包成inputstream,然后再让webview去边读边解析。

VasSonic在截断流后进行部分加载本质上也是这个过程。webview拿到这个SonicSessionStream,和前面的一样,从流里面read()数据边读边解析。只是SonicSessionStream这个inputSream中有已经加载好的流和未加载的节点流,SonicSessionStream重写了read()方法,读的时候先读已经加载好的流,再从节点流中读(因为是从网上读,可能会阻塞)。

VasSonic在这里的优化,并不是webview初始化好以后,把一部分数据给webview,先进行渲染生成画面,再给他另外一部分数据。而是,SonicSessionStream利用了webview的初始化的时间差来做了部分数据加载工作。等webview初始化好以后先读本地数据再读网络节点的数据。这样比等webview初始化好以后再从节点流中边度边解析要节省一点时间(因为read()本地数据时不会有阻塞)。

所以回到,昨天问的那个问题。当webview已经初始化好以后再读网络数据,其实时间差已经没有了。这时候把一部分数据给webview先渲染,再给另一部分数据。提前去掉loading标志这个事情能不能行得通,暂且不知道(有可能行不通,比如webview可以边读边解析dom,但是渲染界面需要完整数据才可以)。但VasSonic在这里的优化不是说的这个事情。

边读边解析并不是webview独有的特性。只要是能读inputStream进行解析的情况都可以叫做“边读边解析”。我们从网络下载一段json字符串后,json再进行解析成model,Gson有一个方法T model= gson.frmJson(inputSteam data),可以直接接受节点流生成model,这就是边读边解析。并不是说一定要下载好整个json string以后,我们才可以反序列化成对象。我们之前那么做,可以是为了方便缓存。不过也可能确实不知道也可以这么用,对于缓存,我们可以把节点流包成我们自定义的一个流,重写流中的read()方法:在里面写一些缓存逻辑。

所以VasSonic的这个技巧,我们也可以用在其他地方。比如打开一个视频,我们可以在这个视频组件或其他view初始化过程中,利用好这个时间差。将网络数据的一部分先加载到本地,然后等视频组件初始化好以后,把加载好的本地流和节点流组成一个SessionStream给视频组件进行解析。这样视频组件先read()本地的数据,这是不会有阻塞的。读完本地以后再度网络的(可能会阻塞)。这比初始化好视频组件以后,进行解析的数据都是来自网络节点 时间上要快一些(如果所有都从网络节点上读,可能阻塞的时间多)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,498评论 25 707
  • 转载请注明出处: Webview秒开框架VasSonic源码分析(一) Webview秒开框架VasSonic源码...
    陈文超happylion阅读 8,123评论 2 16
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,184评论 11 349
  • 多么渴望有三条命 一条命 用来生活 一条命 用来爱 一条命 用来精进智慧 那该多完美啊 如若不能 就用这一条命 活...
    雪莉诗话阅读 380评论 0 1
  • 取消医嘱: 是给病人用药过程中发现有不良反应时不能在用药了,费用要收取的;作废医嘱是下了医嘱还没有给病人执行时,可...
    中华小匠人阅读 18,919评论 0 0