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

Android Kotlin开发中lateinit变量polyline未初始化异常求助

解决Kotlin Android中lateinit变量polyline的UninitializedPropertyAccessException异常

问题根源分析

  1. 异步请求时序问题:routesDetails中的网络请求是异步执行的,而onMapReady会在地图加载完成后立即调用drawRouteOnMap,此时网络请求还未返回,polyline尚未被赋值,触发未初始化异常。
  2. 代码逻辑错误:
    • onResponse中使用了未定义的routeResponse变量,导致即使网络请求成功,也无法进入polyline赋值的代码块。
    • API Key获取错误:R.string.google_api_key.toString()仅返回资源ID的字符串形式,而非实际的API Key,会导致网络请求失败,polyline永远无法被赋值。

分步解决方案

1. 修复API Key获取方式

将错误的API Key获取代码替换为正确的字符串资源读取方式:

val apiKey = getString(R.string.google_api_key)

2. 保存GoogleMap实例,确保时序同步

  • 先定义可空的GoogleMap变量,用于保存地图实例:
private var mMap: GoogleMap? = null
  • 在onMapReady中赋值,并判断polyline是否已初始化(如果网络请求先完成,可以直接绘制):
override fun onMapReady(map: GoogleMap) {
    mMap = map
    // 若polyline已完成赋值,直接绘制路线
    if (::polyline.isInitialized) {
        drawRouteOnMap()
    }
}

3. 修复网络请求回调的逻辑错误

修正onResponse中的变量引用,并在成功获取polyline后,确保地图准备好再调用绘制方法:

private fun routesDetails(origin: String, destination: String, apiKey: String){
    val routeService = ServiceBuilder.buildService(RouteService::class.java)
    val requestCall = routeService.getRoutes(origin, destination, apiKey)
    requestCall.enqueue(object: Callback<RoutesResponse> {
        override fun onResponse(call: Call<RoutesResponse>, response: Response<RoutesResponse>) {
            if (response.isSuccessful) {
                val routeResponse = response.body()
                // 确保响应体不为空且有路线数据
                if (routeResponse != null && routeResponse.routes.isNotEmpty()){
                    // 处理可能的null值,避免空指针
                    polyline = routeResponse.routes[0].overview_polyline?.points ?: ""
                    // 地图实例准备好后再绘制路线
                    mMap?.let {
                        drawRouteOnMap()
                    }
                }
            }
        }

        override fun onFailure(call: Call<RoutesResponse>, t: Throwable) {
            // 处理请求失败场景,比如打印日志或提示用户
            t.printStackTrace()
        }
    })
}

4. 优化lateinit变量的风险(可选)

将lateinit的polyline改为可空类型,避免未初始化的风险,同时在绘制方法中做空判断:

// 替换lateinit变量为可空类型
private var polyline: String? = null

private fun drawRouteOnMap() {
    polyline?.let { line ->
        val decodedPolyline = PolyUtil.decode(line)
        // 这里添加绘制路线到地图的逻辑,例如:
        mMap?.addPolyline(PolylineOptions().addAll(decodedPolyline).color(Color.BLUE))
    } ?: run {
        // 处理polyline为空的情况,比如提示用户无法获取路线
        Toast.makeText(this, "无法获取路线数据", Toast.LENGTH_SHORT).show()
    }
}

额外注意点

  • 确保网络权限已在AndroidManifest.xml中声明:<uses-permission android:name="android.permission.INTERNET" />
  • 检查Google Maps API是否已在控制台启用,且API Key配置正确

内容的提问来源于stack exchange,提问作者kosi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:35:15