要實現在鴻蒙上發起數據請求,有兩個方案:
- 一是針對每個數據請求接口,封裝一個新的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查找生成年度報告數據入口的簡單操作。
