需求: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,隐藏自定义出错界面。

安卓webview断网处理的更多相关文章

  1. WebView断网提示

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/9913968.html 重写WebViewClient中的方法,然后WebView.setWebViewC ...

  2. 安卓Webview缓存网页数据(无网络正常显示)

    热度 1已有 52 次阅读2016-8-26 17:53 |个人分类:常见问题|系统分类:移动开发 一.需求经历 最近的项目是一个原生 +webview 显示的 APP,一开始的时候,网站那边要求我们 ...

  3. cordova/webapp/html5 app 用corsswalk替换内核,优化安卓webview

    Crosswalk与WebView的不同 为什么要用corsswalk?由于cordova应用在安卓上运行的时候,都是调用的手机webview,而在不同的安卓机.不同版本的系统上,webview的性能 ...

  4. dubbo连接zookeeper注册中心因为断网导致线程无限等待问题【转】

    最近维护的系统切换了网络环境,由联通换成了电信网络,因为某些过滤规则导致系统连不上zookeeper服务器(应用系统机器在深圳,网络为电信线路,zookeeper服务器在北京,网络为联通线路),因为我 ...

  5. ubuntu wifi连接不上或经常断网,重启就好

    问题1.知道wifi密码,驱动也有,可以点击连接,总是提示"连接断开,您现在处于离线状态". 1.打开终端"ctrl+alt+T" 2.输入: sudo vim ...

  6. 解决rtl8723be无线网卡驱动频繁断网问题

    买了新本子,用的是rtl8723be无线网卡,连WIFI时总是断网.Windows下好解决,Ubuntu下可就麻烦了,又是升级内核又是编译驱动的,折腾了一天,终于找到了解决办法: # echo &qu ...

  7. arp断网攻击解决办法

    局域网中有这个提示arp断网攻击是正常的,说明防火墙已经拦截了,是有人用P2P工具控制你的网速,或者是局域网有机器中病毒了也会有这样的提示,不过不用担心,今天给大家带来几个防止arp断网攻击的办法,希 ...

  8. 安卓webview下使用zepto的swipe失效

    安卓webview下使用zepto的swipe遇到的坑 众所周知,安卓手机上touch事件一直有各种各样莫名其妙的问题. 比如,我想要用swipeLeft/swipeRight监听向左向右滑动事件,如 ...

  9. iOS 断网处理

    iOS 断网处理 (2014-01-13 18:13:21) 转载▼ 标签: it   - (BOOL)application:(UIApplication *)application didFini ...

随机推荐

  1. HTML中添加<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

    https://www.cnblogs.com/nxl0908/p/7245837.html Edge模式告诉IE以最高级 模式渲染文档,也就是任何IE版本都以当前版本所支持的最高级标准模式渲染,避免 ...

  2. 11个实用的CSS学习工具[转载收藏]

    1. 盒子模型的幻灯片 通过3D转换效果产生的互动的幻灯片.按向左或向右箭头键切换,全屏观看会有更好的效果. 2. CSS Diner 通过一个简单的小游戏让你学习CSS selector,输入正确的 ...

  3. C++模拟OC的多重自动释放池

    使用过OC的都知道,OC的引用计数机制用起来还比较方便.于是就仿照OC的形式搞了个C++引用计数. 支持多重自动释放池,每次autorelease都会放到栈顶的自动释放池中. 自动释放池也可以像变量一 ...

  4. BZOJ1822 Frozen Nova 冷冻波

    1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MB Description WJJ喜欢“魔兽争霸”这个游戏. ...

  5. 58、synchronized同步方法

    线程安全问题 先看下面代码出现的问题: 定义一个Task类,里面有一个成员变量和一个有boolean类型参数的方法,方法内部会根据传入参数修改成员变量的值. package com.sutaoyu.T ...

  6. 8、String练习题

    String练习   1.字符串反转,例如将"abc"变成"cba" 2.统计一个字符串里面另一个字符串出现的次数,例如统计"monkey" ...

  7. (一)利用 mdb 调试获取 nvlist_t 中 nvpair_t(name/value) 对

    服务器:192.168.2.122 root@2236:~# mdb -k> ::spaADDR                 STATE NAME                       ...

  8. const与指针

    C++中const与指针 1.常指针: ; int * const pInt = &x; 其中PInt是常指针,pInt的值无法改变,但其指向的内容可以改变. 2.指向常量的指针 有两种写法: ...

  9. jQuery遍历方式

    对象遍历

  10. rollup&&cube

    group by 擴展 rollup&&cube --按job分組計算不同job的匯總工資   SELECT job, SUM (sal)     FROM emp GROUP BY ...