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 无关,不展开。
相关推荐
松仔log6 小时前
Java中级——组合和继承
android·java·开发语言
我命由我123459 小时前
Jetpack Compose - MaterialExpressiveTheme 与 MaterialTheme、ColorScheme
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime
lilian23310 小时前
Harmony os 技术实战|拼豆制图06:收藏 ID、生成记录与重启恢复怎么不打架
android·java·数据库·harmonyos
2601_9557596210 小时前
ClaudeAPI成本中心与业务标签设计指南
android·java·数据库
余衫马10 小时前
2026最新版!Android Studio 极速安装与配置指南
android·ide·android studio
AFinalStone10 小时前
Android 7系统异常问题排查(五)Framework层(下)—System Server崩溃
android·tombstone·系统异常
AFinalStone10 小时前
Android 7系统异常问题排查(八)系统追踪—Trace机制与性能诊断
android·系统异常
极客猴子14 小时前
Android录音转写频繁卡顿?多款APP长时间会议场景稳定性实测
android·人工智能·智能手机·飞书
Kapaseker14 小时前
Boolean 变量到底该怎么命名?
android·kotlin
AFinalStone14 小时前
Android 7系统异常问题排查(六)应用异常(上)—ANR机制全解
android·系统异常