如何秒开WebView?Android性能优化全攻略!

在Android应用开发中,WebView是一个常用的组件,用于在应用中展示网页内容。然而,WebView的启动速度和性能可能会影响用户体验,特别是在一些性能较低的设备上。本文将介绍一些优化WebView启动的技巧,以提高应用的响应速度和用户体验。

在优化WebView启动的过程中,主要有以下几个方面:

  1. 加载优化:通过预加载,延迟加载,可以有效减少启动的时间。
  2. 请求优化:通过并行、拦截请求策略,可以加快网络耗时,与减少重复的耗时。
  3. 缓存优化:合理使用缓存,减少网络请求,提高加载速度。
  4. 渲染优化:合理的启动硬件加速,可以有效的提高渲染速度。
  5. 进程优化:启用多进程模式,可以避免主线程阻塞,内存泄漏、异常crash等问题。

下面我们将详细说明这些优化技巧。

加载优化

预加载技巧

在应用启动时提前初始化WebView并进行预加载,可以减少WebView首次加载页面的时间。可以在应用的启动过程中将WebView加入到IdelHandler中,等到主线程空闲的时候进行加载。

fun execute() {
    // 在主线程空闲的时候初始化WebView
    queue.addIdleHandler {
        MyWebView(MutableContextWrapper(applicationContext)).apply {
            // 设置WebView的相关配置
            settings.javaScriptEnabled = true
            // 进行预加载
            loadUrl("about:blank")
        }
        false
    }
}

延迟加载

延迟加载是指将一些非首屏必需的操作推迟到首屏显示后再执行。通过延迟加载,可以减少首屏加载时间,提升用户体验。例如,可以在首屏加载完成后再发起一些后台网络请求、埋点,或者在用户首次交互后再执行一些JavaScript操作。

// 延迟2秒执行上报埋点
Handler().postDelayed({
    // 上报启动统计
    reportStart()
}, 2000)

请求优化

并行请求

在加载H5页面时,通常会先加载模板文件,然后再获取动态数据填充到模板中。为了提升加载速度,可以在H5加载模板文件的同时,由Native端发起请求获取正文数据。一旦数据获取成功,Native端通过JavaScript将数据传递给H5页面,H5页面再将数据填充到模板中,从而实现并行请求,减少总耗时。

// 在加载模板文件时,同时发起正文数据请求
webView.loadUrl("file:///android_asset/template.html")

// 获取正文数据
val contentData = fetchDataFromServer()

// 将数据传递给H5页面
webView.evaluateJavascript("javascript:handleContentData('" + contentData + "')", null)

拦截请求

可以通过自定义WebViewClient来拦截WebView的请求。重写shouldInterceptRequest方法,可以拦截所有WebView的请求,然后进行相应的处理。

override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse? {
    // 在此处实现请求拦截的逻辑
    if (needIntercept(request)) {
        // 拦截请求,返回自定义的WebResourceResponse或者null
        return interceptRequest(request)
    } else {
        // 继续原始请求
        return super.shouldInterceptRequest(view, request)
    }
}

缓存优化

WebView缓存池

WebView缓存池是一组预先创建的WebView实例,存储在内存中,并在需要加载网页时从缓存池中获取可用的WebView实例,而不是每次都创建新的WebView。这样可以减少初始化WebView的时间和资源消耗,提高WebView的加载速度和性能。

private const val MAX_WEBVIEW_POOL_SIZE = 5
private val webViewPool = LinkedList<WebView>()

fun getWebView(): WebView {
    synchronized(webViewPool) {
        if (webViewPool.isEmpty()) {
            return MyWebView(MutableContextWrapper(MyApp.applicationContext()))
        } else {
            return webViewPool.removeFirst()
        }
    }
}

fun recycleWebView(webView: WebView) {
    synchronized(webViewPool) {
        if (webViewPool.size < MAX_WEBVIEW_POOL_SIZE) {
            webViewPool.addLast(webView)
        } else {
            webView.destroy()
        }
    }
}

缓存策略

WebView提供了缓存机制,可以减少重复加载相同页面的时间。可以通过设置WebView的缓存模式来优化加载速度,如使用缓存或者忽略缓存。示例代码如下:

// 在WebView的初始化代码中启用缓存
webView.settings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK

共享缓存

对于一些频繁访问的数据,如公共的CSS、JavaScript文件等,可以将其缓存到应用的本地存储中,然后在多个 WebView 实例之间共享。

// 从本地存储中加载公共资源并设置给 WebView
webView.loadDataWithBaseURL("file:///android_asset/", htmlData, "text/html", "UTF-8", null)

渲染优化

启用硬件加速

启用硬件加速可以提高WebView的渲染速度,但是在一些低端设备上可能会造成性能问题,因此需要根据实际情况进行选择。

<application android:hardwareAccelerated="true" ...>
    ...
</application>

进程优化

启用多进程

WebView的加载和渲染可能会阻塞应用的主线程,影响用户体验。为了提升应用的性能和稳定性,可以考虑将WebView放置在单独的进程中运行,以减轻对主进程的影响。

<activity android:name=".WebViewActivity"
          android:process=":webview_process">
    ...
</activity>

其它

  1. DNS优化:也就是域名解析,相同的域名解析成ip系统会进行缓存,保证端上api地址与webview的地址的域名一致,可以减少域名解析的耗时操作。
  2. 静态页面直出:由于在渲染之前有个组装html的过程,为了缩短耗时,让后端对正文数据和前端的代码进行整合,直接给出HTML文件,让其包含了所需的内容和样式,无需进行二次加工,内核可以直接渲染。
  3. http缓存:针对网络请求,增加缓存,例如,添加Cache-Control、Expires、Etag、Last-Modified等信息,定义缓存策略。

结语

以上介绍了一些 Android WebView 启动优化技巧。通过这些优化措施,可以有效提升 WebView 的启动速度,改善用户体验。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容