美文网首页
Android WebView关于内存泄漏疑问及启动卡顿问题

Android WebView关于内存泄漏疑问及启动卡顿问题

作者: 宇智波_佐星 | 来源:发表于2019-12-04 13:30 被阅读0次

大嘎好,今天我记录对于我来说项目中经常会遇到的关于WebView的问题。


猴赛雷

第一先说一下WebView内存泄漏的问题,网上收了很多资料,至于内存泄漏的原因大致就是WebView会因为一些原因持有Activity里面的引用,并且WebView并不会随着Activity销毁而销毁导致此Activity无法被回收。

处理的方法大致分两种
一种是通过动态添加WebView的方式替代直接写在XML里面,并且上下文对象传入Application。然后在Activity销毁时处理一下WebView.代码如下

 webView = WebView(App.getIns())
        val params = LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.MATCH_PARENT
        )
        webView?.layoutParams=params
        webContainer.addView(webView)
        webView?.loadUrl("https://www.jianshu.com/p/8311410de676")
   override fun onDestroy() {
        val group = webView?.parent as ViewGroup
        group?.removeView(webView)
        webView?.stopLoading()
        webView?.getSettings()?.setJavaScriptEnabled(false);
        webView?.clearHistory();
        webView?.clearView();
        webView?.removeAllViews();
        webView?.destroy();
        super.onDestroy()
    }

第二种方式是通过给含有WebView的Activity配置新进程,并在这个Activity销毁的时候调用
System.exit(0)
来强制关闭这个进程,这个方法可以说是非常暴力非常直接。


下面说一下遇到的第二个问题, 在startActivity到含有WebView的Activity时,第一次跳转会有明显的卡顿。手机性能越差这个卡顿越明显。

一想到卡顿第一反应就是主线程做了耗时操作,于是我机智的想开个子线程去创建WebView然后在主线程中再去AddView添加到视图上。。。。然后我就这么操作了


结果报了这么一个错
java.lang.RuntimeException: WebView cannot be initialized on a thread that has no Looper.
好吧。子线程中肯定行不通的,然后我又机智的想到能不能等跳转Activity完成之后再加载WebView.

那么把添加WebView的时机放到onWindowFocusChanged

override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus&&isFirst){
            webView = WebView(App.getIns())

            val params = LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT
            )
            webView?.layoutParams=params
            webContainer.addView(webView)
            webView?.loadUrl("https://www.jianshu.com/p/8311410de676")
        }
    }

然后测试了一下有效果了,但是效果只能说一般,跳转速度大概快了一半。考虑了一下可能还是因为onWindowFocusChanged不够靠后,那么干脆一点 我们直接做一个200毫秒的延迟试一试

        Observable.interval(200,TimeUnit.MILLISECONDS)
            .take(1)
            .observeOn(AndroidSchedulers.mainThread())
            .doOnComplete {
                initWebView()
            }
            .subscribe()

测了一下,效果很棒,Activity是打到了瞬开,至于WebView的加载时机反正本菜鸡这里设置的是200毫秒,我能接受这个延迟,大家也可以自己再减一点测试一下。

相关文章

  • Android WebView关于内存泄漏疑问及启动卡顿问题

    大嘎好,今天我记录对于我来说项目中经常会遇到的关于WebView的问题。 第一先说一下WebView内存泄漏的问题...

  • Android进阶

    一、性能优化 ANR,内存溢出,内存抖动,内存泄漏,UI卡顿,冷启动优化(https://www.jianshu....

  • Android 内存泄漏总结

    Android 性能相关知识 Android性能之 内存泄漏总结 Android性能之 卡顿分析解决 Androi...

  • 闲谈Android中的内存泄漏

    Part 1 在长久以来的 Android 开发过程中,内存泄漏一直是一个比较头疼的问题。内存泄漏会导致应用卡顿,...

  • android 内存泄漏总结

    android 内存泄漏总结 前言 内存泄漏很危险。轻则卡顿,重则oom。这种东西写代码的时候注意一下就能避免90...

  • Android UI性能分析常用工具

    Android开发过程中,难免会遇到ui卡顿,内存泄漏情况,下面介绍常用工具来解决上述问题 1. UI卡顿的原因①...

  • Android如何避免WebView内存泄漏

    Android如何避免WebView内存泄漏 什么是内存泄漏 内存泄漏通俗的讲就是你创建了一个对象,却没有在合适的...

  • WebView安全漏洞面试问题

    需要了解 1.WebView常见的一些坑 2.关于WebView的内存泄漏问题 ----------------W...

  • 性能优化与保活

    ------内存泄漏优化------Android 内存优化你的 Handler 内存泄露 了吗?Android卡...

  • 性能优化总结

    性能优化方向 流畅(启动速度、卡顿) 稳定(内存泄漏、崩溃) 功耗(耗电、网络) 安装包(包体积) 一、 流畅 卡...

网友评论

      本文标题:Android WebView关于内存泄漏疑问及启动卡顿问题

      本文链接:https://www.haomeiwen.com/subject/jlmkgctx.html