WebView页面快速加载优化实践
通过对WebView页面加载性能的深入优化,我们成功将加载时间从10多秒提升至3-4秒。项目中采用了X5WebView(腾讯开发的WebView组件),并结合内存缓存策略实现了性能突破。

优化方案的核心是将最多6个WebView页面缓存至内存中,并将负责加载WebView的H5Activity设置为常驻不关闭状态。
第一步:设置Activity的启动模式
<activity
android:name=".h5.H5Activity"
android:launchMode="singleInstance"
android:exported="false"
android:screenOrientation="landscape"
android:windowSoftInputMode="adjustPan">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
android:launchMode="singleInstance"设置说明:
- 系统中仅保留该Activity的一个实例
- 该实例独占一个任务栈
- 从任意地方启动该Activity都会复用这个唯一实例
- 适用于需要全局单例显示的界面,如闹钟、来电界面等
这样配置后,负责加载WebView的Activity将无需重复创建,有效提升性能。
第二步:避免不必要的销毁操作
将finish()操作替换为moveTaskToBack(true)以保持Activity状态。
第三步:实现WebView页面缓存
// WebView缓存实现
private val webViewCache = object : LinkedHashMap<String, WebViewCacheBean>(6, 0.75f, true) {
override fun removeEldestEntry(eldest: MutableMap.MutableEntry<String, WebViewCacheBean>?): Boolean {
// 内存不足或缓存数量超限时触发清理
val isLowMemory = HeapMemoryUtil.getRemainingHeapMemoryMB() < 80L
val isOverMaxCount = size > 6
if (isLowMemory || isOverMaxCount) {
// 回收最久未使用的WebView资源
eldest?.value?.let { oldWebView ->
recycleWebView(oldWebView)
}
return true
}
return false
}
}
系统会根据当前内存状态和缓存数量自动回收最久未使用的WebView资源,确保内存使用效率。每次页面加载时,系统会优先查找缓存中的WebView实例。
内存监控实现:
// 获取剩余的可申请堆内存大小
fun getRemainingHeapMemoryMB(): Long {
try {
val runtime = Runtime.getRuntime()
val maxHeapBytes = runtime.maxMemory()
val usedHeapBytes = runtime.totalMemory() - runtime.freeMemory()
val remainingHeapBytes = maxHeapBytes - usedHeapBytes
return remainingHeapBytes / (1024 * 1024)
} catch (e: Exception) {
e.printStackTrace()
return -1
}
}