webView项目总结(持续更新...)

共勉

无论是写文章,还是摘录文章,都是一个梳理思维,学习成长的过程,当忘记了还可以回来翻一下,看一看,或者有什么新的想法可以重新编辑一下,方便了自己,也分享了知识,有意的可以一块学习,互相交流。谢谢大家!有错误或者意见还请指出共同进步。

网上关于webview加载html网页的内容也很多,在这里不多说,在这里说一下我项目中遇到的虽然说简单但是一时想不到的东西。

one

在客户使用报错java.lang.RuntimeException: android.os.DeadSystemException,如果你有幸也遇到了这个错误,那应该也是webview的坑,通过查阅stackoverflow和大神的一些博客,这个问题是由于 webview还没有加载完成,这个时候要关闭它,此过程中系统报出这个错误。解决办法就是 当你结束webview的时候,Webview还依附在父控件下,使用解决这个问题就是在WebView.destroy()前要解除他们之间的依附关系。

    //在你的界面的destory中执行这段代码,就可以解决你的错误。
    parent.removeView(webView);
    webView.removeAllViews();
    webView.destroy();

two

自定义错误的提示界面

 //当发生错误时调用此方法
@Override      
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {

                // 自定义错误提示页面,背景色为灰色,带有文字(注意文字不要输汉字,由于编码问题汉字会变乱码              )
                String errorHtml = "<html><body style='background-color:#e5e5e5;'><h1>Page Not Found " + 
                        "!</h1></body></html>";
                view.loadData(errorHtml, "text/html", "UTF-8");

                //当然你可以加载本地已经有的界面
                //view.loadUrl(" file:///android_raw/error.html");
            }
});

three

获取Web页中的title用来设置自己界面中的title

 @Override    
            public void onReceivedTitle(WebView view, String title) {    
                super.onReceivedTitle(view, title);    
                //对自己的控件赋值
                txtTitle.setText(title);    
            }    

four

如何截获webview中加载的url并判断是app内显示还是跳转浏览器显示?

    // 网页加载开始调用的方法
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                loading.setVisibility(View.VISIBLE);
                //url就是你加载的URL字符串,我们读取到某些特殊的URL,你可以判断包含哪部分而做出不同的处理(我项目中跳转的事本公司的网址)
                if (url.contains("你加载的网址特殊的部分") || url.contains("你加载的网址特殊的部分")) {
                //跳转浏览器访问
                    Uri uri = Uri.parse(url);
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(intent);
                }
                //webview显示
                super.onPageStarted(view, url, favicon);
            }

如果你想截获后并修改。请看(不过很少有这样的需求)
http://www.tuicool.com/articles/VFzY3y3

four

android webview ZoomButtonsController 导致android.view.WindowLeaked 问题

错误的原因其实就是:webview的 ZoomButton,也就是那两个放大和缩小的按钮。如果设置为让他们出现,并且可以自动隐藏,那么,由于他们的自动隐藏是一个渐变的过程,所以在逐渐消失的过程中如果调用了父容器的destroy方法,就会导致Leaked。解决方案就是,在destroy之前,先让他俩立马消失。

找到一个简单的方法:

    @Override
    protected void onDestroy() {
    //清除总布局所有的子view,就不会报错了
        ViewGroup view = (ViewGroup) getWindow().getDecorView();
        view.removeAllViews();
        //双重保险,让webview隐藏
        webView.setVisibility(View.GONE);
        webView.removeAllViews();
        webView.destroy();
        super.onDestroy();
    }

发现是,导致的。如果设置为让他们出现,并且可以自动隐藏,那么,由于他们的自动隐藏是一个渐变的过程,所以在逐渐消失的过程中如果调用了父容器的destroy方法,就会导致Leaked。
所以
至于立马消失的方法,网上大多抄来抄去,没有效果。
我的解决办法是,在finish掉此activity时,把子view 全部remove掉。理论上说,只需要remove这个zoom view就可以,但是我没找到获取该view的办法,只好remove掉所有的子view。这样在activity destroy时就不会报WindowLeaked的错误了。

five

https://www.jianshu.com/p/b9164500d3fb
https://www.jianshu.com/p/2b2e5d417e10
https://www.jianshu.com/p/44b977907e51

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值