原以为一个不到 3MB (扣除挡广告的资料档)的 Andrid App,既没有任何的 tracking 机制,也没有从网路抓任何非网页内容的资料回来,理论上网页载入速度要快到不行才对。
但这一阵子在使用时,总觉得在切换网页时,那条进度条总是会卡在 10% 的地方一下下,才会继续往下进行。一开始以为是因为要去找每个 url 的 dns 位址,所以慢了半拍。但在同个设备上的其他浏览器又没有这样子的毛病。
终於!在某天晚上阴错阳差的解其他问题时,让我仔细看到了 updateProgress()
的实作。看完後差点没吐血。当 WebView
在载入网页时,会不断回报目前的载入进度,这时,这个函式就是用来更新相关画面的。但它除了更新画面的进度条外,竟然还做了很多意想不到的事情。
除了 1108 行到 1114 行是在更新进度条的呈现,1114 行的 updateAutoComplete()
是去资料库中捞取新的资料出来,以备使用者要手动输入网址时,可以提供相关的资讯;scrollChange()
则是在设定 WebView
的 ScrollListener
。而 HelperUnit.initRendering()
是在检查要不要把画面颜色整个做反转。
updateAutoComplete()
这件事,完全不需要在这边出现。只要等使用者点下网址列,想要开始输入时再去做一次就好了(如果那时候觉得有需要)。它被放在这边,每次载入网页,都会被呼叫许多次,在资料库中不断地查重覆的资料出来。如果使用者记录了很多书签,和浏览记录已经累积了好几百笔几千笔的话,这样子每个呼叫都要花不少时间。
这也难怪我会觉得每次在载入网页时,进度列总是会卡住一下,因为 updateAutoComplete()
正在疯狂地跟资料库索取资料。把它移走後,果然速度就有了很大幅度的提升!
至於 scrollChange()
,这种只需要在 WebView
生成的时候,或是网页完全载入的时候呼叫一次就好的函式,我也把它搬到网页载入完成後的逻辑中。
最後的 HelperUnit.initRendering()
,我就整段拿掉了。最终的实作变成这样:
刚刚提到造成载入速度慢的其中一点是:在更新 AutoCompleteTextView
所需的资料时,会去从资料库读取书签和历史记录。在原本的实作中,历史记录是无上限的。
也就是说,如果你使用了这个 browser 半年的话,你的 App 中包含了你这半年来的所有浏览记录,这将会造成每次在读取资料库时,时间会愈来愈长。
为了解决这问题,我在每次新增浏览记录时,会去把资料库中超过 2 周的历史记录删掉。透过这方式来限制浏览记录的无限增长。
相关程序码如下:
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)
}
...
}
// 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 优化应用程序元件注册顺序开发与方法
前言 网站上线後,希望给更多人能找到的话,通常会用 Google Search Console,让自...
居然还有第31天~ 此篇的上一篇是https://ithelp.ithome.com.tw/arti...
前言 既然可以使用grid-area为每个区域命名,并填入grid-template-areas中,...
角色情境 小明,是一位刚进入职场的菜鸟工程师。 坐在他隔壁的同事,小华,是一位年资约五年的资深工程师...
如果不想要大家一起通灵通出一坨O,请不要偷懒做好规划。我说那个Excel写出来的功能列表也是不够的,...