需求:webview在加载的时候如果网络断开,会显示默认的错误界面,长得很丑,需要单独写一个页面,在网路出错的时候显示,点击重试以后重新加载网页

乍看挺简单的需求,但在实际过程中页碰到了不少坑,主要是webview造成的,在此记录一下。

一:如何判断网络出错:

方案:在webviewClient的回调中监听onReceiveError回调,如果走到这里,说明网络出错了,隐藏webview,显示自定义出错界面。

于是有了:

安卓webview断网处理-LMLPHP

如果这么做,会有许多问题:

问题1:该函数是6.0才有的,6.0以下的手机只能用一个过时的回调:

安卓webview断网处理-LMLPHP

解决方案:为了兼容,需要两个回调都写上,都进行处理

问题2: 在有些网页加载以后,有些链接也会收到error回调,但是此时网络是好的,比如新浪微博的文章,如果点击以下文章,也会跑到该error回调中来。

解决方案:由于网络断开的时候的description是独有的(errorCode不行),所以可以用description进行判断:

安卓webview断网处理-LMLPHP

其中

安卓webview断网处理-LMLPHP

注意,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,隐藏自定义出错界面。

04-18 15:23