要实现在鸿蒙上发起数据请求,有两个方案:
- 一是针对每个数据请求接口,封装一个新的HTTP Open API接口,客户端可以通过HTTP(S)直接访问;
- 二是客户端通过H5页面里的JS版Network库发起数据请求 。
前端业务使用的JS版本的网络库,其使用方式是通过JS中的Promise机制来实现异步回调,但是这种方式在Java中并不好实现对应的调用结构 。所以这里需要有一层封装,将网络请求结果通过简单回调来通知请求方 。相应的在Java侧需要对WebView注册全局的JS对象,实现JS对象的回调方法,打通JS -> Java的调用通路 。
这个方案在纸面上看着还不错,但是在实际使用中会发现有严重的性能瓶颈 。WebView本身是一个很重的控件,在进程中首次创建的时候会比较耗时,有很多的so加载、初始化等工作 。加载HTML是一个网络请求,耗时在百毫秒级,而加载并解析完HTML以后,还要再加载JS版本的网络库,又是一次网络访问 。等JS网络库加载并解释执行后,才可以正常服务调用方 。
要在这个过程中进行优化,这里有主动权的地方就是加载HTML和JS网络库这两个文件 。在鸿蒙系统中,WebView可以通过设置WebAgent来实现特定URL的劫持,将其转化为读取本地资源中的HTML和JS文件 。
public class LoadAgent extends WebAgent {// ...@Overridepublic ResourceResponse processResourceRequest(WebView webView, ResourceRequest request) {// mInterceptor用于识别HTML和JS网络库的URL,并返回本地资源中的HTML和JS 。ResourceResponse response = mInterceptor.intercept(request);if (response != null) {return response;}return super.processResourceRequest(webView, request);}}这可以将两个百毫秒级的串行操作缩减为毫秒级,大大减少JS版本的网络库的初始化时间 。数据缓存从网络请求返回的卡片数据,除了用于即时渲染卡片之外,还会被保存一份到本地存储中 。如果下一次发起网络请求的时候,无法正常访问网络(例如手机重启后一时连不上网络),则可以使用缓存中的卡片数据先渲染一下,使用户不至于完全看不到内容 。这就需要有一套卡片数据的缓存管理能力 。
针对卡片数据的特点,我们使用了两个数据库表来存储卡片的缓存数据 。根据卡片大小不同,请求中会提供不同的参数给服务端 。反过来说,同样大小的卡片发出请求的参数是相同的,也就是说同样大小的卡片请求得到的数据是相同的 。所以有一个表用来存储不同大小的卡片数据,每个卡片大小对应一条记录,包括唯一标识、卡片大小、请求返回的数据、时间戳等 。
系统不限制用户向桌面添加卡片的数量,同时在服务中心也可以有已经添加到桌面的卡片 。所以同样的卡片数据是可以被显示在多个卡片上的 。数据库需要有一个表来记录每一个卡片的信息,包括卡片的唯一标识、卡片大小、数据表中对应的记录等 。
如果在Android中实现过ContentProvider,一般都会比较熟悉SQLite数据库 。通常ContentProvider需要管理大量、不同类型且互相有关联的数据,这种需求用SQLite来实现最合适了 。这里管理卡片数据的缓存也具有同样的特征,并且鸿蒙系统也提供了SQLite数据库的使用接口 。典型的数据库初始化操作如下:
- 猫生完一个月又怀孕了
- 狗主人能不能碰刚生产的狗狗
- 金毛生产前征兆?金毛生产前有什么征兆
- 金毛生产前准备什么?金毛生产需要准备什么东西
- 猫咪鼻子干是怎么回事
- 狗下崽为什么不能看?狗生产不能看?
- 火影ol怎么手机玩,为什么没能诞生《原神》
- 双子大厦怎么打,生死狙击双子大厦通关打法
- 艺术字体logo在线生成器 艺术字体生成器在线制作
- 我来分享微信APP查找生成年度报告数据入口的简单操作。
