Android Kotlin开发中lateinit变量polyline未初始化异常求助
解决Kotlin Android中lateinit变量polyline的UninitializedPropertyAccessException异常
问题根源分析
- 异步请求时序问题:
routesDetails中的网络请求是异步执行的,而onMapReady会在地图加载完成后立即调用drawRouteOnMap,此时网络请求还未返回,polyline尚未被赋值,触发未初始化异常。 - 代码逻辑错误:
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
相关产品推荐
相关产品推荐

