文档章节

浅谈Hybrid

Android小闹
 Android小闹
发布于 2017/08/01 16:15
字数 1668
阅读 2.8K
收藏 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小闹
粉丝 14
博文 4
码字总数 4268
作品 0
朝阳
高级程序员
私信 提问
加载中
此博客有 4 条评论,请先登录后再查看。
提高数据库查询性能浅谈

1)数据库设计方面: a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎...

hello菜bird
2016/02/25
1.8K
3
kerkee在Android上的快速上手指南

kerkee是一个多主体共存型Hybrid框架,具有跨平台、用户体验好、性能高、扩展性好、灵活性强、易维护、规范化、集成云服务、具有Debug环境、彻底解决跨域问题。 Github上的地址: OSChina上的...

子鸿
2016/04/28
92
0
浅谈Hessian远程调用及其使用

1.1 概述 Hessian是一个轻量级的remoting onhttp工具,是由 caucho 提供的一种开源的远程通讯协议。相比WebService,Hessian更简单、快捷、同时支持跨语言通讯。Hessian采用的是二进制RPC协议...

科比可比克
2016/06/29
221
2
部署DNS域名解析服务器—BIND Server

一、浅谈DNS解析技巧 在搭建服务器之前,我们需要了解一下DNS域名解析原理,《DNS原理及其解析过程》,总体上,《DNS原理及其解析过程》对解析过程说的非常清楚。 在这里,补充和强调以下了三...

IamOkay
2016/07/02
1.6K
0
浅谈Oracle性能调整工具

原载于 http://bbs.landingbj.com/t-0-240612-1.html Oracle性能调整在工作中经常遇到,比如Top SQL的出现导致系统资源浪费严重、物理读过多导致IO出现瓶颈、独占锁导致事务不能提交、索引建...

breakawaylove
2014/10/11
102
2

没有更多内容

加载失败,请刷新页面

加载更多

红队之windows用户和组

目录 0x01 用户账户和组策略 0x02 Windows中的访问控制 0x03 安全标识符SID 0x04 用户账户控制(UAC) 用户帐户 用户帐户是对计算机用户身份的标识,本地用户帐户、密码存在本地计算机上,只...

黑白天安全团队
昨天
0
0
厉害了!百度智能云NIRO Pro智能机器人半年内连获三项产品设计大奖

短短半年内,百度智能云NIRO Pro智能机器人连获三项产品设计大奖,其中包括有“设计界奥斯卡”之称的德国红点奖,成功引领了全球助理机器人的工业设计和发展趋势风向标。红点奖评委这样评价,...

百度智能云
2019/12/04
0
0
StringBuider 在什么条件下、如何使用效率更高?

作者:后青春期的Keats cnblogs.com/keatsCoder/p/13212289.html 引言 都说 StringBuilder 在处理字符串拼接上效率要强于 String,但有时候我们的理解可能会存在一定的偏差。最近我在测试数据...

Object_Man
今天
0
0
发布更新|腾讯云 Serverless 产品动态 20200813

一、云函数 SCF + Ckafka 联合转储方案正式发布 发布时间: 2020-08-06 产品背景: SCF + Ckafka 联合转储方案可以帮忙用户节省使用与开发成本,用户可以将 Ckafka 消息转储同步转储至消息队...

腾讯云Serverless
17分钟前
5
0
如何正确强制执行Git推送? - How do I properly force a Git push?

问题: I've set up a remote non-bare "main" repo and cloned it to my computer. 我已经建立了一个远程的非裸露的“主”仓库,并将其克隆到我的计算机上。 I made some local changes, u......

javail
19分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部