android webview 黑屏问题 , 页面加载时间有点长的情况下

android webview 黑屏问题


What(做了什么)

Flayp Signage 内嵌的 WebViewMainActivity.ktPlayerWebView)上增加了三类行为:

  1. layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)

    明确与全屏容器一致的测量意图(贴近系统 WebView Browser TesterActivity + FrameLayout 中的写法)。

  2. onPageFinishedpost { evaluateJavascript(...) }

    在页面加载完成后,向页面注入一次 window.dispatchEvent(new Event('resize')) ,促使页面内联的 setRem() (随 resize 重新计算根字号)再执行。

  3. attachRemReflowOnceWhenSized()

    通过 View.OnLayoutChangeListener ,在 第一次 出现 width > 0 && height > 0 时再触发一次上述 resize,然后移除监听(只执行一次)。

此外,与 H5 自带 <meta name="viewport" ...> 配合时,已保持:

  • settings.useWideViewPort = true
  • settings.loadWithOverviewMode = false
    避免「整页缩成概览」导致主体区域像被挤出可视区(与 Tester 的默认缩放策略更一致)。

Why(为什么 / 解决什么问题)

现象

  • 同一 URL(如 game-place-view/admin.html)在 WebView Browser Tester 或系统浏览器中 列表、比分正常
  • Flayp 里 often 仅蓝条标题可见,下方大面积黑色 ,而 logcat 里 XMDS / WebSocket / STOMP MESSAGE 仍正常

根因归纳

对比项 WebView Browser Tester Flayp(Compose)
容器 传统 Activity,WebView 多为 MATCH_PARENT 一次量准 AndroidView 嵌入 Box,首帧常出现宽/高为 0 再变为全屏
页面逻辑 内联 setRem() 依赖 document.documentElement.clientWidth / window.innerWidth 若在 视口仍为 0×0 或未稳定 时跑过 setRem()rem 基准会错 ,导致 #app 下列表区域高度/缩放异常,视觉上像「只有头、下面全黑」

因此问题不首先是「没数据」 ,而是 Compose 测量时序 + 页面 rem 适配 叠加后的 渲染布局问题


Where(改在哪里)

  • 文件app/src/main/java/com/flayp/signage/MainActivity.kt
  • 位置PlayerWebViewiframe 分支loadUrl)与 loadDataWithBaseURL 分支WebView 初始化处;以及文件内私有扩展/方法:
    • WebView.requestRemReflowAfterLayout()
    • WebView.attachRemReflowOnceWhenSized()

When(何时会触发 reflow)

时机 作用
onPageFinished 文档声明加载完成后再 post 触发 resize,给 setRem 一次机会。
首次 layout 宽高为正 覆盖 onPageFinished、后 Compose 才把 WebView 拉大 的顺序,避免永远停留在错误 rem。

How(如何实现)

  1. evaluateJavascript 执行最小脚本:
    (function(){ try { window.dispatchEvent(new Event('resize')); } catch(e) {} })();

    复用页面已有的 window.addEventListener('resize', setRem),不依赖页面导出全局函数名。

  2. post { ... } 保证在 UI 线程下一帧 执行,避免与 WebView 内部布局竞争。

  3. OnLayoutChangeListener 在宽高有效后触发一次再 remove,避免重复抖动与多余 JS 调用。


验证建议

  • assembleDebug 安装到 API 31+ 模拟器或真机 ,横屏对比 FlaypWebView Browser Tester 同一 URL。
  • chrome://inspect :必要时对比 Console / Elements 中 #app 高度与根字号。
  • 若仅老系统 WebView(如 Chrome 51 级别)仍白屏,需另论 ES 语法兼容性 (与 minSdk / 系统 WebView 升级相关),不在本文 reflow 改动范围内。

相关历史改动(简述)

  • loadWithOverviewMode = false :与带 viewport 的 H5 配合,避免整页被缩成「概览」后主体不可见。
  • 国内 Gradle/Maven 镜像、buildToolsVersion:属构建环境,与页面 reflow 无关,不展开。
相关推荐
折翅鵬7 小时前
Android史诗级网络优化实践总结
android·网络
赏金术士9 小时前
Android 项目模块化与 Feature 组件实践
android·kotlin·模块化
summerkissyou198713 小时前
Android-UI-获取屏幕尺寸的方法
android·ui
用户860225046747213 小时前
Kotlin 函数式编程入门与实践指南
android
最爱睡觉睡觉睡觉15 小时前
CSS → Flutter 对照手册
android·前端
xingpanvip15 小时前
星盘接口开发文档:马盘次限盘接口指南
android·开发语言·python·php·lua
用户261904985615716 小时前
JUnit4 完整配置流程
android
用户261904985615716 小时前
JaCoCo 完整配置流程
android
QING61816 小时前
Android面试 —— 八股文之app启动流程
android·面试·app
海鸥-w17 小时前
python(fastapi) 实现更新,新增,删除接口
android·python·fastapi