我是靠谱客的博主 优雅银耳汤,这篇文章主要介绍webView项目总结(持续更新...)共勉,现在分享给大家,希望可以做个参考。

共勉

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

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

one

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

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

two

自定义错误的提示界面

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
//当发生错误时调用此方法 @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

复制代码
1
2
3
4
5
6
7
@Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); //对自己的控件赋值 txtTitle.setText(title); }

four

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 网页加载开始调用的方法 @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之前,先让他俩立马消失。

找到一个简单的方法:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
@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

最后

以上就是优雅银耳汤最近收集整理的关于webView项目总结(持续更新...)共勉的全部内容,更多相关webView项目总结(持续更新内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(90)

评论列表共有 0 条评论

立即
投稿
返回
顶部