文档章节

浅谈Hybrid

Android小闹
 Android小闹
发布于 2017/08/01 16:15
字数 1668
阅读 2305
收藏 97

Hybrid

#一.了解Hybrid 词典上的翻译 就是混合体的意识 那么在移动开发中他就是Native+Web混合开发的意思

Hybrid

#二.Native App、Web App、Hybrid App

对比图表

总结起来两句话:

纯Native的迭代太慢,不能动态更新,且不能跨平台

纯Web页,有很功能无法实现,有些动画效果实现其体验太差

因此我们需要Hybrid

ps:怎样判断一个App的页面是native的还是web的?

Android手机 设置->开发者选项->显示布局边界 即可

#三.Web Native 如何通信 说Hybrid首先肯定是要从Web和Native图和通讯说起

Android里面

Android call JS 两种Api

  1. WebView loadUrl()

  2. WebView evaluateJavascript()

Android call JS

当你的App只需要支持4.4以上的手机的时候就用evaluateJavascript() 确实4.4一下的手机越来越少不到10%,否则老老实实loadurl()

JS call Android 三种Api

  1. addJavascriptInterface

  2. shouldOverrideUrlLoading()

  3. alert()、confirm()、prompt()

JS call Android

如果不需要考虑只有5%的人使用的4.2以下的手机果断addJavascriptInterface 需考虑ios统一问题就拦截Url 需要返回值拦截prompt()

最后因为考虑到版本兼容和ios统一的问题 我们最终选择的是loadUrl + shouldOverrideUrlLoading的方式

web2native详细讲述请点击

各种方式的详细使用Demo请点击我的GitHub

#四.Hybrid框架设计 Hybrid设计无非就是要考虑如下的几件事情 如图是我们刚刚起步的Hybrid框架开发 Hybrid实现情况

支持组件调用(如吐司,dialog 进度条等等),支持方法调用 就是把通过shouldOverrideUrlLoading拦截到的url进行封装解析的过程。

缓存前期可以用系统自带的缓存,当然想要更灵活我们可以自己搞一套,详见下面的Cache部分。

页面的统一跳转意思就是在我们App开发完之后,js可以跳转到已经有的任意页面,这就需要一个好的路由配置,可以仿造Arouter 自己开发一个轻量级的页面路由功能,解耦页面间的跳转。

拓展和复用就不用我多说了,这里面肯定有一个循序渐进的过程。

#五.Cache Android的网页缓存有两种

###1.浏览器缓存

就是所有的浏览器都支持的缓存,是页面级的缓存。

根据协议头中的参数定义的缓存Cache-Control(或 Expires)和 Last-Modified(或 Etag)。

所以说浏览器缓存是缓存在协议层上的实现。

下面是58同城M站首页随便的一个js,我们看到他设置的是600秒也就是十分钟的缓存时间,

而上次更新时间确实16年5月20号。我们分别记录了第一次访问,第二次访问,和十分钟后的第三次访问。

我们看到Status code 分别是 200|200(from disk cache)|304

这就意味着分别是从网络获取|本地缓存获取|以及请求之后发现没有更新|再取本地

Hybrid

Android这边可以根据Api控制webview的浏览器缓存策略。

WebSettings webSettings= webView.getSettings();
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

LOAD_CACHE_ONLY:不使用网络,只读取本地缓存数据

LOAD_DEFAULT:根据cache-control决定是否从网络上取数据。

LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式

LOAD_NO_CACHE:不使用缓存,只从网络获取数据.

LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

上面的缓存机制可以基本满足我们WebApp的需求,但是我们的Hybrid可以做的更好

想做的更好就要解决这两个问题

  1. 缓存的时间不知道设置多长时间合适,设置的长了不能及时更新,设置的短了没有缓存的效果
  2. 304虽然不下载 但是有请求 也耗资源

我们已一个具体的例子来解释下

Hybrid

这是谁网上找到的应用案例,首先超时时间设置了半年,相当于可以不用考虑 同是根据资源的版本号,判断是否需要网络请求新版本的js

当然这样做的代价就是需要一个本地的资源与版本的映射关系,服务端也要=做好一个更新版本的管理后台。

这里参考了大牛的文章

###2.H5缓存

是数据级的缓存 一共五种如下

Hybrid

所以相对的H5缓存是缓存在应用层上的实现

我们最终采用的是浏览器缓存+Dom storage的方式,其中dom storage用于存储一些数据,方便一些表单的重复提交

这里推荐一篇写的非常好的解释缓存的文章

#六.统一页面跳转路由

最后我们聊聊页面的统一跳转,这个不是Hybrid必须的,但是可以解决大项目,复杂项目,组件化比较明显的项目

使各个Model 各种实现形式的页面之间解耦。

各种路由实现上大同小异,这里以Arouter为例简单解释,我们在搭建Hybrid框架的过程中,可以慢慢模仿实现,没必要全盘引入

这样既可以轻量,对自己也是一个提高。

###首先是遇得到的痛点

  1. Native页面 WebView 浏览器外链 页面的实现形式太多,页面跳转不好管理,耦合性高
  2. 各modle间页面的相互唤起,尤其是低级model如何唤起上级model的activity
  3. 页面pv uv不好统一统计

###Arouter

主要的功能点是:

  1. Native WebView 页面的统一跳转
  2. 外链、统一入口
  3. 业务降级
  4. 跳转拦截
  5. 声明使用简单
  6. 支持处理『未知页面』

解决了上面的用户痛点

具体的使用方法git上面写的很清楚了,这里就不赘述了。

Github地址

我们根据他的原理看看我们如何模仿着做一个轻量级的。

原理如图所示

Hybrid

在这里应用了JavaPoet在编译时对注解内容进行解析,行程对应关系类,在运行时生成页面映射信息,减少了运行时的开销。

当然我们自己的Hybrid前期可以简单的用注解和反射替代javaPoet,在运行时生成一个映射表,来起到相同的作用。


本文旨在给大家掀开hybrid的大门,了解Hybrid的整体思路,后续随着我们项目的不断完善,我会写一篇专门介绍Hybrid从0到1的文章,欢迎大家指教。

© 著作权归作者所有

共有 人打赏支持
Android小闹
粉丝 13
博文 4
码字总数 4268
作品 0
朝阳
高级程序员
加载中

评论(4)

Android小闹
Android小闹

引用来自“懒懒想睡觉”的评论

虽然也写hybrid,但是我也看不懂。。- -
:broken_heart:
Android小闹
Android小闹

引用来自“3kqing”的评论

虽然看不懂,但是写的不错!
:kissing_heart::kissing_heart:
懒懒想睡觉
虽然也写hybrid,但是我也看不懂。。- -
Skqing
Skqing
虽然看不懂,但是写的不错!
浅谈Hybrid技术的设计与实现

随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发效率的要求,这个时候使用IOS&Andriod开发一个APP似乎成本有点过高了,而H5的低成本、高效率、跨平台等特性马上被利用...

黄金林
2016/12/21
10
0
【初窥javascript奥秘之让人捉摸不定的this】你知道现在this指向哪里吗???

前言 之所以会有此篇文章当然还要从最近的一次面试说起,很抱歉居然又扯到面试上去看,其实不要说,平时不注意的东西,往往在面试时便会立马给你揪出来哪里有问题。 比如我当时就小小的栽了个...

范大脚脚
2017/12/14
0
0
浅谈Hybrid技术的设计与实现第二弹

上文说了很多关于Hybrid的概要设计,可以算得上大而全,有说明有demo有代码,对于想接触Hybrid的朋友来说应该有一定帮助,但是对于进阶的朋友可能就不太满足了,他们会想了解其中的每一个细节...

北方人在上海
2016/06/03
54
0
ELSE 技术周刊(2017.10.02期)

本期推荐 ES6 Promise:模式与反模式 这是一篇有用的关于常见 Promise 模式和反模式的文章。 业界动态 React v16.0 React 16 如期发布,遵循 MIT 许可。 当地时间 9月 26 日,FB 工程师 Andr...

风清洋ELSE
2017/10/02
0
0
浅谈Native、Web App、Hybrid、RN 和 Weex优劣

一句话概要 Native、Web App、Hybrid、React Native(后面以RN简称)、Weex 间的异同点,后期同步 小程序 和 PWA App常用开发模式【简介】 此处App为应用,application,并非我们通常讲的手机...

木羽zwwill
2017/09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
今天
0
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
今天
3
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
2
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
今天
3
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部