Kotlin中WebView加载轨迹地图模拟器正常真机偶发仅显示黑背景问题
可行解决方案如下:
1. 修复Base64编码参数
你当前使用Base64.DEFAULT编码HTML内容,该参数会自动在输出内容中插入换行符,物理机WebView解析带换行的Base64内容时存在偶发失败的情况,将编码参数替换为Base64.NO_WRAP即可解决该问题:
// 修改callVM方法中的loadData行 wv_map.loadData(Base64.encodeToString(apiResponse.toByteArray(StandardCharsets.UTF_8), Base64.NO_WRAP), "text/html; charset=utf-8", "base64")
2. 调整初始化与加载时序
你当前代码的执行顺序为setupButtonActions→setupWebLayout→onResume加载数据,存在WebView配置未完成就触发内容加载的时序风险,物理机性能差异会放大该问题。调整为WebView配置完成后再执行后续操作:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_map) Log.d(TAG, "onCreate: "+args.map) this.mMap = args.map Log.d(TAG, "onCreate: "+SimplePossession.State.valueOf(args.possessionState)) // 先配置WebView setupWebLayout() // 再配置按钮 setupButtonActions() }
同时替换已废弃的clearView()方法,避免旧内容干扰:
// 修改setupWebLayout中的clearView调用 wv_map.loadUrl("about:blank")
3. 添加加载状态监听定位问题
新增WebViewClient监听页面加载状态、报错信息,可快速定位是资源加载失败还是JS执行异常:
// 在setupWebLayout方法中添加如下配置 wv_map.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) Log.d(TAG, "页面加载完成,若轨迹未渲染可在此处主动调用JS渲染方法") // 示例:如果你的HTML中有渲染轨迹的JS方法renderTrack(),可在此处主动触发 // view?.evaluateJavascript("renderTrack()", null) } override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) { super.onReceivedError(view, request, error) Log.e(TAG, "页面加载错误: ${error?.description}") } }
4. 调整硬件加速配置
WebView偶发黑屏大概率和硬件加速渲染异常有关,可尝试给WebView单独设置软件渲染:
// 在setupWebLayout方法中添加 wv_map.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
如果软件渲染出现卡顿,也可尝试在AndroidManifest.xml中给MapActivity单独开启硬件加速:
<activity android:name=".MapActivity" android:hardwareAccelerated="true" />
5. 改用loadDataWithBaseURL加载内容
如果你的HTML中包含相对路径的资源(如轨迹图标、依赖的JS/CSS文件),loadData方法无法正确加载这类资源,改用loadDataWithBaseURL即可:
// 替换callVM中的loadData调用,baseUrl可填写你的资源域名,无外部资源填null即可 wv_map.loadDataWithBaseURL(null, apiResponse, "text/html", "utf-8", null)
内容的提问来源于stack exchange,提问作者Apix_D
相关产品推荐
相关产品推荐

