最大的坑是ROM不同,webkit不同,差异性很大。再加上google的坑,真是坑上加坑。比如js注入问题,比如client回调接口时序问题,

比如内存回收问题,etc





1、内存泄漏问题,尤其注意Android 5.0系统的WebView移除不了的问题;

2、WebKit线程数不能控制,低效,例如,如果js效率出现问题或者大量js执行,直接就导致连HTTP请求都延迟,

自己抓包就知道(你会傻乎乎地去指责服务器同事怎么你们服务器这么烂,网页加载好慢);





3、webcorethread的wait问题,不知道什么时候就会发生,完全束手无策。后果是什么?退出页面没有卵用,只能杀进程。





4、Android4.2以下手机的JavaScript interface的注入漏洞问题,完全不要太危险;





5、弱鸡的一系列ui问题,滚动,滑动,兼容,把网页前端哥们苦不堪言,找Android前端同事投诉,Android同学很无奈,

完全不知道该怎么办。





解决方案:1.跨进程。(无法解决兼容问题)2.放弃它。







一级bug如下:





应用需求,一个页面里面有多个fragment,然后fragment里面都是webview加载内容的,然后你会发现不知道

什么时候(对,就是不知道什么时候),webview加载不出内容了,白屏一片。OK,没问题,加载不出来无所谓啦,大不了重进,

忽悠产品说,偶尔出现而已啦。然而啊,你重进页面没有用,你会发现整个应用任何用webview的地方都加载不出东西来,好了,

玩不下去了。





跟下去,发现底层有一条叫webcore(印象中是这个名字)的线程一直处于wait的状态,再也恢复不了了,唯一拯

救就是杀进程。





在某些手机上,Webview承载视频时,activity销毁后,视频资源没有被销毁。

解决办法:在onDestory之前修改url为空地址。





WebView居然提供了一个超奇葩的Destroy方法,需要自己手动去调一下才能释放资源。否则就算依赖的Activit 或者Fragment不在了,

资源还是不会被释放干净。





1、 onPageFinished这个也是把我坑好久,进度条该结束的时候不结束,不该结束的时候提前结束,

我总结根本原因还是不同版本浏览器内核的实现差异导致的,也深入过内核代码发现确实结束的回调时机有差异,

除非自己做内核,否则除了尽可能的兼容处理外, 尽量保证它提前结束,因为迟迟不结束比提前结束体验要糟糕得多。





2、webView耗电的问题,我们之前发现的一个情况是,webView切换到后台时,如果当前页面有JS代码仍在不时的run, 

就会导致比较严重的耗电,所以必须确保切换到后台后暂停JS执行,同时切回来的时候恢复它。





3. webView闪屏的问题,也是确实存在的,试验过,确实跟硬件渲染有关。





4. 数据积累也是头疼的问题,经常有用户抱怨它的空间被占满了,其实是webkit本身没有管理好缓存,不得不让浏览器开发人员涉法处理。





5.默认的webview滚动条确实很粗,但还是可以修改的。



想起来的的后面再补充:

webview原生支持js与native代码交互,

可惜在4.2以下版本上有安全漏洞,当时被乌云报出来,事情还挺大,各大浏览器厂商都紧急应对,我们也还是想了其他办法,

解决了这个问题。



其实所谓的WebView的各种坑,大部分是Webkit等内核的坑,其实只是它正常发展成熟过程中的一些遗留问题,

随着版本的迭代演化,也在不断改进。 遗憾的是Android版本的严重碎片化,使得这些问题我们不得不面对。





作为Ninja浏览器(mthli/Ninja · GitHub)的开发者,我想我遇到的问题应该具有一些代表性吧。下面说说我比较困惑的几个地方。





WebViewClient.onPageFinished()。你永远无法确定当WebView调用这个方法的时候,网页内容是否真的加载完毕了。

当前正在加载的网页产生跳转的时候这个方法可能会被多次调用,StackOverflow上有比较具体的解释

(How to listen for a Webview finishing loading a URL in Android?), 但其中列举的解决方法并不完美。

所以当你的WebView需要加载各种各样的网页并且需要在页面加载完成时采取一些操作的话,可能WebChromeClient.onProgressChanged()

比WebViewClient.onPageFinished()都要靠谱一些。

WebView后台耗电问题。当你的程序调用了WebView加载网页,

WebView会自己开启一些线程(?),如果你没有正确地将WebView销毁的话,这些残余的线程(?)会一直在后台运行,

由此导致你的应用程序耗电量居高不下。对此我采用的处理方式比较偷懒,简单又粗暴(不建议),即在Activity.onDestroy()中

直接调用System.exit(0),使得应用程序完全被移出虚拟机,这样就不会有任何问题了。

切换WebView闪屏问题。如果你需要在同一

个ViewGroup中来回切换不同的WebView(包含了不同的网页内容)的话,你就会发现闪屏是不可避免的。这应该是Android硬件加速

的Bug,如果关闭硬件加速这种情况会好很多,但无法获得很好的浏览体验,你会感觉网页滑动的时候一卡一卡的,不跟手。

数据积累问题。

开启缓存什么的有利于网页的浏览体验,但你会发现即使是清除了必要的内容,比如Cache、Cookie、Form Data、History、Password等等东西,

你的应用程序所占用的存储空间还是会越来越大,到最后只好手动到系统设置的应用信息界面里清除数据了 :

滚动条问题。Android System WebView的横向滚动条真是好粗的有木有...

以上是我能想到的啦,没想到的大概是不重要所以自动忽略啦~





另外针对Android System WebView的相关开发,推荐看看Google官方的示例教程 GoogleChrome/chromium-webview-samples · 

GitHub

Android WebView编程的那些坑(一)的更多相关文章

  1. Android使用WebView开发常见的坑

    原文链接:http://mp.weixin.qq.com/s?__biz=MzAwODE1NTI2MQ==&tempkey=uP3a%2BOgIN7vPbLfJp3BTCl2KabYi1%2F ...

  2. android webview 漏洞背后的节操

    by superhei 2013/09/06 [注:本文提到的都是我个人的观点,该行为也是私人行为,与任何组织.公司无关.另:水军请自重!] 一.前言   这两天,一个2+年前的android web ...

  3. Android 多进程编程 15问15答!

    ps:阅读本文 需要对android 多进程编程有一定了解. 1.Android中总共有几种方式进行IPC? 答:一共有两种,一种是binder 还有一种是socket.Binder 大家用的比较多. ...

  4. Android网络编程概述

    Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包 ...

  5. 屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能载入页面

    发如今家里的时候用Android App里的WebView打开站点非常慢,会有十几秒甚至更长时间的卡住. 可是在电脑上打开相同的网页却非常快. 查找这个问题的过程比較曲折,记录下来. 抓取Androi ...

  6. Android网络编程要学的东西与Http协议学习

    本节引言: 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程是要干嘛?http协议的学习,使用自带扣脚Json解析类解析Json,XML解析常用的几种方式,HttpUr ...

  7. Android webView包装WebAPP

    前言 Android webView 兼容体验真的差到了极点!! 前一阵子,老板要讲 WebAPP 放到 Android 和 iOS 里面,而我因为以前做过安卓,所以这方面就由我来打包, 原理是很简单 ...

  8. webview之如何设计一个优雅健壮的Android WebView?(下)(转)

    转载:https://iluhcm.com/2018/02/27/design-an-elegant-and-powerful-android-webview-part-two/ (这篇文章写得有点晚 ...

  9. webview之如何设计一个优雅健壮的Android WebView?(上)(转)

    转接:https://iluhcm.com/2017/12/10/design-an-elegant-and-powerful-android-webview-part-one/ 前言 Android ...

随机推荐

  1. 获取sap登陆用户名的中文描述

    一.业务场景: 当通过MKPF-USNAM查找ADRP-NAME_LAST时,中间缺少一个表,即USR21.否则,MKPF-USNAM不能和ADRP-PERSNUMBER直接对等. 二.解决方法: D ...

  2. Java设计模式——装饰模式

    转载自:http://blog.csdn.net/xu__cg/article/details/53024490 抽象构件 public interface CarInterface { void m ...

  3. Codeforces Round #402 (Div. 2)

    Codeforces Round #402 (Div. 2) A. 日常沙比提 #include<iostream> #include<cstdio> #include< ...

  4. Vue脚手架(vue-cli)安装总结

    单页Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序. 提供一 ...

  5. SDN第三次作业

    作业链接 阅读文章:http://www.sdnlab.com/19777.html 阅读<重构网络>第一二章 列举openflow1.0的12元组? 入端口 源MAC地址 目的MAC地址 ...

  6. SaltStack 的远程执行机制

    html,body { font-size: 15px } body { font-family: Helvetica, "Hiragino Sans GB", "微软雅 ...

  7. GitHub中开启二次验证Two-factor authentication,如何在命令行下更新和上传代码

    最近在使用GitHub管理代码,在git命令行管理代码时候遇到一些问题.如果开起了二次验证(Two-factor authentication两个要素认证),命令行会一直提示输入用户名和密码.查找了一 ...

  8. LCA—倍增法求解

    LCA(Least Common Ancestors) 即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. 常见解法一般有三种 这里讲解一种在线算法-倍增 首先我们定义fa[u][j ...

  9. cryptojs的使用

    项目中经常会遇到加密解密的需求,这里有一个js库非常好用,就是crypto-js.下面记录一下使用方法. 首先,安装js库 npm install crypto-js --save 然后,在项目中使用 ...

  10. ireport报表学习

    常用组件介绍: 制作一个报表一般四个组件比较常用,下面分别介绍 Rectangle:用于画表格的样式,整个表格的样式使用次组件做出来的,本控件表现为一个黑色矩形框,多个黑色矩形框排在一起可以组合出来任 ...