Android小知识-了解下WebView

作者: 爱读书的顾先生 | 来源:发表于2018-10-08 09:55 被阅读22次

    WebView的坑点

    1、在API16之前存在远程代码执行漏洞,该漏洞源自于程序没有正确限制使用WebView.addJavascriptInterface方法,攻击者可以使用Java Reflection API利用该漏洞执行任意Java对象和方法。

    2、WebView的销毁和内存泄漏问题。WebView的完全销毁是件麻烦事,一旦销毁流程不正确,极易容易导致内存泄漏。

    WebView的回收实例:

    public class MainActivity extends Activity {
        private FrameLayout mWebContainer;
        private WebView mWebView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.your_layout);
    
            mWebContainer = (FrameLayout) findViewById(R.id.web_container);
            mWebView = new WebView(getApplicationContext());
            mWebContainer.addView(mWebView);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            destroyWebView();
        }
    
        public void destroyWebView() {
    
            mWebContainer.removeAllViews();
    
            if (mWebView != null) {
                mWebView.clearHistory();
                mWebView.clearCache(true);
                mWebView.loadUrl("about:blank"); // clearView() should be changed to loadUrl("about:blank"), since clearView() is deprecated now
                mWebView.freeMemory();
                mWebView.pauseTimers();
                mWebView = null; // Note that mWebView.destroy() and mWebView = null do the exact same thing
            }
    
        }
    }
    

    WebView的内存泄漏的主要原因:

    WebView会关联一个Activity,WebView执行的操作是在新线程当中回收,时间Activity没有办法确认,Activity的生命周期和WebView线程生命周期不一致导致WebView一直执行,因为WebView内部持有Activity的引用,导致Activity一直不能被回收,原理类似于匿名内部类持有外部类的引用一样。

    WebView的内存泄漏的解决方案:

    独立进程,简单暴力,涉及到进程间通信。(开发过程中常用)

    动态添加WebView,对传入WebView中使用Context弱引用,动态添加WebView意思在布局中创建一个ViewGroup用来放置WebView,Activity创建add进来,Activity停止时remove掉。

    其它问题

    WebView硬件加速偶尔导致页面白块,页面闪烁,但是加载速度比较快,解决方案:关闭硬件加速。

    后台耗电(性能优化) :WebView开启网页时会自己开启线程,如果没有合理的销毁,那么残余线程就会一直运行,so这会非常耗电的,解决方案:有一种暴力方式就是Activity的onDestroy中调用System.exit()方法把虚拟机关闭,也可以结合自己应用的WebView的情况设计出一个温柔的方案。

    [图片上传中...(838794-506ddad529df4cd4.webp.jpg-f7ebe0-1538964271778-0)]

    Android、Java、Python、Go、PHP、IOS、C++、HTML等等技术文章,更有各种书籍推荐和程序员资讯,快来加入我们吧!关注技术共享笔记。

    838794-506ddad529df4cd4.webp.jpg

    搜索微信“顾林海”公众号,定期推送优质文章。

    相关文章

      网友评论

        本文标题:Android小知识-了解下WebView

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