You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:24:06