在Android中从API 30开始,AsyncTask类已被弃用并且不推荐使用。 因此,在此示例中,我们将使用协程而不是AsyncTask。
地理编码非常容易使用,您只需要将经纬度传递给Geocoder类即可获得地址。
以下代码片段说明了如何通过使用协程执行地理编码:
// 在MainViewModel中获取地址
suspend fun getAddressFromLatLong(lat: Double, long: Double): String {
val geocoder = Geocoder(context, Locale.getDefault())
return withContext(IO) {
geocoder.getFromLocation(lat, long, 1).firstOrNull()?.getAddressLine(0) ?: ""
}
}
在此示例中,我们首先实例化了一个Geocoder对象,然后在使用withContext(IO)
协程块中传递纬度和经度。 通过该协程块,我们可以获得与经纬度匹配的地址列表。我们使用 .firstOrNull()
检查列表中是否包含地址,并通过 .getAddressLine(0)
获取地址的第一行信息。
然后,我们可以在任何地方调用此函数以获取地址。
// 在Activity中更新UI
fun updateUI(lat: Double, long: Double) {
lifecycleScope.launch {
val address = viewModel.getAddressFromLatLong(lat, long)
addressTextView.text = address
}
}
在此示例中,我们在lifecycleScope
中启动协程以获取地址,然后将其设置为包含地址信息的TextView。
使用协程代替AsyncTask,既有助于避免应用程序崩溃, 还改善了应用程序的性能,因此建议尽快更新代码。