电子书阅读器上的浏览器 [Day29] 网页载入性能改善

原以为一个不到 3MB (扣除挡广告的资料档)的 Andrid App,既没有任何的 tracking 机制,也没有从网路抓任何非网页内容的资料回来,理论上网页载入速度要快到不行才对。

但这一阵子在使用时,总觉得在切换网页时,那条进度条总是会卡在 10% 的地方一下下,才会继续往下进行。一开始以为是因为要去找每个 url 的 dns 位址,所以慢了半拍。但在同个设备上的其他浏览器又没有这样子的毛病。

移除造成载入缓慢的逻辑

终於!在某天晚上阴错阳差的解其他问题时,让我仔细看到了 updateProgress() 的实作。看完後差点没吐血。当 WebView 在载入网页时,会不断回报目前的载入进度,这时,这个函式就是用来更新相关画面的。但它除了更新画面的进度条外,竟然还做了很多意想不到的事情。

https://ithelp.ithome.com.tw/upload/images/20210927/201402600vlDVMI8CS.png

除了 1108 行到 1114 行是在更新进度条的呈现,1114 行的 updateAutoComplete() 是去资料库中捞取新的资料出来,以备使用者要手动输入网址时,可以提供相关的资讯;scrollChange() 则是在设定 WebViewScrollListener。而 HelperUnit.initRendering()是在检查要不要把画面颜色整个做反转。

updateAutoComplete() 这件事,完全不需要在这边出现。只要等使用者点下网址列,想要开始输入时再去做一次就好了(如果那时候觉得有需要)。它被放在这边,每次载入网页,都会被呼叫许多次,在资料库中不断地查重覆的资料出来。如果使用者记录了很多书签,和浏览记录已经累积了好几百笔几千笔的话,这样子每个呼叫都要花不少时间。

这也难怪我会觉得每次在载入网页时,进度列总是会卡住一下,因为 updateAutoComplete() 正在疯狂地跟资料库索取资料。把它移走後,果然速度就有了很大幅度的提升!
至於 scrollChange(),这种只需要在 WebView 生成的时候,或是网页完全载入的时候呼叫一次就好的函式,我也把它搬到网页载入完成後的逻辑中。

最後的 HelperUnit.initRendering() ,我就整段拿掉了。最终的实作变成这样:

https://ithelp.ithome.com.tw/upload/images/20210927/20140260DG76vq4Fhs.png

限制历史记录的容量

刚刚提到造成载入速度慢的其中一点是:在更新 AutoCompleteTextView 所需的资料时,会去从资料库读取书签和历史记录。在原本的实作中,历史记录是无上限的。

也就是说,如果你使用了这个 browser 半年的话,你的 App 中包含了你这半年来的所有浏览记录,这将会造成每次在读取资料库时,时间会愈来愈长。

为了解决这问题,我在每次新增浏览记录时,会去把资料库中超过 2 周的历史记录删掉。透过这方式来限制浏览记录的无限增长。

相关程序码如下:

  • 先在 RecordAction class(原先实作关於资料库的操作) 中加入删除历史记录的函式
class RecordAction {
...
    fun purgeOldHistoryItem(days: Int) {
         val tsBefore = System.currentTimeMillis() - (1000 * 60 * 60 * 24) * days
         val sql = "DELETE FROM ${RecordUnit.TABLE_HISTORY} WHERE ${RecordUnit.COLUMN_TIME} <= $tsBefore"
         database.execSQL(sql)
     }
...
}
  • 将它加到 addHistory 的呼叫逻辑後
// in NInjaWebViewClient.kt
    override fun onPageFinished(view: WebView, url: String) {
        ninjaWebView.albumTitle = view.title ?: ""
        if (config.saveHistory && !ninjaWebView.incognito && !isTranslationDomain(url)) {
            val action = RecordAction(context)
            action.open(true)
            if (action.checkHistory(url)) {
                action.deleteHistoryItemByURL(url)
                action.addHistory(Record(ninjaWebView.title, url, System.currentTimeMillis()))
             } else {
                 action.addHistory(Record(ninjaWebView.title, url, System.currentTimeMillis()))
             }
			 // 加入这一行
             action.purgeOldHistoryItem(14)
             action.close()
         }

做了这些改善後,就再也不用等候慢慢的载入速度啦!

参考原始码版本

https://github.com/plateaukao/browser/releases/tag/v8.16.1


<<:  小知识 - Google Sheets 与 Excel 世仇之战

>>:  [Day - 14] - Spring 优化应用程序元件注册顺序开发与方法

Day27 - 如何让 Google 搜寻到你的网站

前言 网站上线後,希望给更多人能找到的话,通常会用 Google Search Console,让自...

第31天~从开启旧专案方法(番外篇)

居然还有第31天~ 此篇的上一篇是https://ithelp.ithome.com.tw/arti...

【心得】你今天种菜了吗? grid之路-grid的使用(5)

前言 既然可以使用grid-area为每个区域命名,并填入grid-template-areas中,...

後记

角色情境 小明,是一位刚进入职场的菜鸟工程师。 坐在他隔壁的同事,小华,是一位年资约五年的资深工程师...

[Day03 - 规划与设计] 建立 Wireframe 让你开发不迷路

如果不想要大家一起通灵通出一坨O,请不要偷懒做好规划。我说那个Excel写出来的功能列表也是不够的,...