关于WebView 重定向行为导致的多次加载的问题

 更新时间:2020年03月25日 09:32:52   作者:房子D  
这篇文章主要介绍了关于WebView 重定向行为导致的多次加载的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

使用 WebView 时,我们通常会重写以下方法:

shouldOverrideUrlLoading()
onPageStarted()
onPageFinished()

一、WebView 内部点击连接,他们的回调顺序是这样的:

1、如果是固定的地址:

shouldOverrideUrlLoading() -> onPageStarted()-> onPageFinished()

shouldOverrideUrlLoading()由于它要提供给APP选择加载网页环境的机会,所以只要是网页上地址请求,都会获取到。

2、如果是重定向地址,在跳转到目的地址之前会不断重定向,每一次重定向都会回调:

redirection: onPageStarted()->shouldOverrideUrlLoading()->onPageFinished()

那么一个正常的重定向地址,方法的执行顺序就是:

shouldOverrideUrlLoading()->redirection -> … ->redirection ->onPageStarted()->onPageFinished()

二、开启WebView 直接loadUrl(其实就是少了shouldOverrideUrlLoading()):

1、 如果是目的地址,那么方法的执行顺序是:

onPageStarted()-> onPageFinished()

loadUrl()加载地址时,一般不会触发shouldOverrideUrlLoading(),一旦触发了,就说明这是一个重定向地址。

2、 如果是重定向地址,方法的执行顺序就是:

redirection -> … -> redirection ->onPageStarted()->onPageFinished()

所以,如果我们想要自定义进度条,就要考虑如何避免重定向行为导致的多次加载问题:

设置一个Boolean全局变量flag,

在onPageStarted()中设置为true,若加载样式没有开启,就开启进度条等加载样式;

在onPageFinished()中检测,如果为true,就说明已经是目的地址,可以关闭加载样式,如果是false,就不做处理,继续等待;

在shouldOverrideUrlLoading()中,设置为false,若加载样式没有开启,就开启进度条等加载样式

这样就可以很好的控制加载样式和网址跳转之间的关系了。

或参考:How to listen for a WebView finishing loading a URL?

补充知识:webview多次调用onPageFinished问题

项目中遇到了webview多次调用onPageFinished问题,相关文章比较多,但是很多是无效的,甚至有些需要服务器修改。

直到谷歌到https://stackoverflow.com/questions/3149216/how-to-listen-for-a-webview-finishing-loading-a-url

才发现有用的方案

其中这个方法最终优雅得解决了我的问题

public void onPageFinished(WebView view, String url) {
      super.onPageFinished(view, url);
      if (m_webView.getProgress() == 100) {
        progressBar.setVisibility(View.GONE);
        m_webView.setVisibility(View.VISIBLE);
      }
    } 

以上这篇关于WebView 重定向行为导致的多次加载的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Android OpenGL入门之GLSurfaceView

    Android OpenGL入门之GLSurfaceView

    这篇文章主要介绍了OpenGL入门知识,如何在Android中使用GLSurfaceView,如果对OpenGL感兴趣的同学,可以参考下
    2021-04-04
  • Android实现简单加法计算器

    Android实现简单加法计算器

    这篇文章主要为大家详细介绍了Android实现简单加法计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 21天学习android开发教程之SQLite分页读取

    21天学习android开发教程之SQLite分页读取

    21天学习android开发教程之SQLite分页读取,Android包含了常用于嵌入式系统的SQLite,免去了开发者自己移植安装的功夫,感兴趣的朋友可以参考一下
    2016-02-02
  • Android中AsyncTask的用法实例分享

    Android中AsyncTask的用法实例分享

    AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行, 这就有效地避免了使用Handler带来的麻烦
    2014-02-02
  • 如何在Android中实现一个简易的Http服务器

    如何在Android中实现一个简易的Http服务器

    这篇文章主要介绍了如何在Android中实现一个简易的Http服务器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Android split分割特殊字符取名称的方法

    Android split分割特殊字符取名称的方法

    这篇文章主要为大家详细介绍了Android split分割特殊字符取名称的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Android自适应不同屏幕大小的全部方法

    Android自适应不同屏幕大小的全部方法

    这篇文章主要介绍了Android自适应不同屏幕大小的全部方法,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧
    2018-05-05
  • Android 实现无网络页面切换的示例代码

    Android 实现无网络页面切换的示例代码

    本篇文章主要介绍了Android 实现无网络页面切换的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Android实现3D推拉门式滑动菜单源码解析

    Android实现3D推拉门式滑动菜单源码解析

    这篇文章主要为大家详细解析了Android实现3D推拉门式滑动菜单源码以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
    2017-11-11
  • 在Android app中实现九(n)宫格图片连续滑动效果

    在Android app中实现九(n)宫格图片连续滑动效果

    这篇文章主要介绍了在Android app中实现九(n)宫格图片连续滑动效果的方法,作者举了凤凰新闻应用的例子,同理功能图标也可以利用这样的滑动效果,需要的朋友可以参考下
    2016-02-02

最新评论