需求:webview在加载的时候如果网络断开,会显示默认的错误界面,长得很丑,需要单独写一个页面,在网路出错的时候显示,点击重试以后重新加载网页
乍看挺简单的需求,但在实际过程中页碰到了不少坑,主要是webview造成的,在此记录一下。
一:如何判断网络出错:
方案:在webviewClient的回调中监听onReceiveError回调,如果走到这里,说明网络出错了,隐藏webview,显示自定义出错界面。
于是有了:
如果这么做,会有许多问题:
问题1:该函数是6.0才有的,6.0以下的手机只能用一个过时的回调:
解决方案:为了兼容,需要两个回调都写上,都进行处理
问题2: 在有些网页加载以后,有些链接也会收到error回调,但是此时网络是好的,比如新浪微博的文章,如果点击以下文章,也会跑到该error回调中来。
解决方案:由于网络断开的时候的description是独有的(errorCode不行),所以可以用description进行判断:
其中
注意,error.getDescription需要在api > 安卓6.0才能用,需要添加注解@RequireApi。
二:如何恢复显示
方案:出错的判断已经好了,那么如何在网络恢复的时候显示webview呢?因为没有网络恢复的回调,自然想到用一个Flag来记录网络是否出错。即在onPageStarted的时候flag为false,即没有出错,如果回调到onError里,让flag=true,此时在onPageFinished回调里就能知道网页有没有出错了。
问题:从断网到网络恢复,点击重试,在某些页面下会出问题(比如新浪微博文章),即:网页会闪现以下默认的error页面,原因是什么呢?
经过一番debug终于发现,onPageFinished这个回调,在有些网页(比如新浪微博)会调两次,第一次webview的progress只有70 第二次是100,也就是说网页没加载完,onPageFinished就已经调用了。
解决方案:判断progress,只有等于100时,才显示webview,隐藏自定义出错界面。