安卓端App页面狂刷问题记录

一、场景

App基于webview混合开发,业务主要为前端h5实现,其中有一个功能为消息中心,当从通知栏点击消息跳转到指定页面时,前端会不停地刷新页面,一遍又一遍地重复同一批请求。

二、问题分析

1、刚开始怀疑是否前端里面调用了reload 或者 框架提供的刷新接口,在反复刷新页面,通过沟通排查确认没有。并且自己将框架里面所有的刷新接口都注释掉,情况依然出现,所以此原因排除。

2、当正常打开App从对应菜单进入到改跳转页面时,都是正常的,不会出现反复刷新请求,只有从消息跳转进入才会,因为怀疑是否为使用Intent 跳转Activity 问题,然后经过排查调试代码,发现这个点也非问题原因。

3、苹果端无此问题,聚焦安卓端webview回调分析

定位到 shouldOverrideUrlLoading 方法, 发现自己的代码为如下写法:

public boolean shouldOverrideUrlLoading(final WebView view, final String url)

{

view.loadUrl(url);

return true;

}

在网上查阅一番:

webview中shouldOverrideUrlLoading方法解析-CSDN博客

发现这个写法是错误的,

/**

* Give the host application a chance to take control when a URL is about to be loaded in the

* current WebView.

* 给宿主应用一个机会去控制在当前webview即将加载的一个url。

*

* If a WebViewClient is not provided, by default WebView will ask Activity

* Manager to choose the proper handler for the URL.

* 如果没有提供(自定义创建)WebViewClient,通过默认的webview会要求Activity Manager去处理当前URL。(补充:通常是系统浏览器)

*

* If a WebViewClient is provided,returning

* 如果提供了(自定义创建设计)WebViewClient

*

* {@code true} causes the current WebView to abort loading the URL, while returning

* 返回true会导致当前webview中止加载url,

*

* {@code false} causes the WebView to continue loading the URL as usual.

* 返回false会导致webview正常继续加载url。

*

* Do not call {@link WebView#loadUrl(String)} with the request's

* URL and then return {@code true}.

* 不要调用loadUrl方法并且返回true。

*

* The correct way to continue loading a given URL is to simply

* return {@code false}, without calling {@link WebView#loadUrl(String)}.

* 继续加载url的正确的做法就是简单的返回false即可,不需要调用loadUrl方法。

*/

根据接口说明,只有当拦截某些需要特殊处理的请求时,需要增加判断然后返回true, 否则直接返回false, 会调用父类中的类处理。 而此处直接使用view.loadUrl 方式加载了一次,可能就是导致无线循环刷新页面的原因,当将此处代码调整后,果然这个问题解决了。

后续再回想当时为何这么写,已然不是太记得了,可能是当时为了防止请求直接调用手机中的浏览器?

另外此问题只在特定项目的App前端里面才出现,原因就是只有那个项目的前端在点击消息跳转时才会触发这个回调方法,其他地方都不会触发这个,包括此项目的正常进入此菜单页面,也不会触发,所以对于这个触发条件现在也不太清楚,需要后续有时间再和前端一起确认,项目催得急着解决问题,先就这样吧。

相关推荐
鹏多多8 分钟前
flutter-屏幕自适应插件flutter_screenutil教程全指南
android·前端·flutter
小龙报10 分钟前
【C语言初阶】动态内存分配实战指南:C 语言 4 大函数使用 + 经典笔试题 + 柔性数组优势与内存区域
android·c语言·开发语言·数据结构·c++·算法·visual studio
小龙报13 分钟前
【算法通关指南:算法基础篇(三)】一维差分专题:1.【模板】差分 2.海底高铁
android·c语言·数据结构·c++·算法·leetcode·visual studio
TeleostNaCl27 分钟前
使用 Android Jetpack 中的 Startup 组件快速实现组件初始化逻辑与主模块解耦
android·经验分享·android jetpack·androidx·android runtime·jetpack android
恋猫de小郭38 分钟前
让 AI 用 Flutter 实现了猗窝座的破坏杀·罗针动画,这个过程如何驯服 AI
android·前端·flutter
2501_9371931411 小时前
技术加持!PLB-TV:HDR10+UDP 传输
android·源码·源代码管理·机顶盒
霸王大陆13 小时前
《零基础学 PHP:从入门到实战》模块十:从应用到精通——掌握PHP进阶技术与现代化开发实战-2
android·开发语言·php
低调小一16 小时前
在 Android 上获取视频流逐帧时间戳并与 GPS/IMU 对齐(CameraX 实践)
android
Android_Trot17 小时前
Flutter android 多渠道配置,多包名、icon、等配置。
android·flutter