从协程之外的协程内部获取值?



我是kotlin编程的新手,必须完成一个导游项目。我想我有一个很简单的问题,但是我太笨了,无法解决它。

在以下代码段我想使用val"loc"(这是来自协程/addOnSuccessListener的内部)作为"startlocation"当前设置为LatLng(49.7913, 9.9534)"在协程之外。但是如何在主线程之外获得这个值呢?遗憾的是,我不能只做"val startlocation = loc"(

请问,有人有一个简单的解决方案吗?提前感谢!

override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
val routenuebergabe = intent.getStringExtra("tourname").toString()
Firebase.firestore.collection("Routen").document(routenuebergabe).get()
.addOnCompleteListener { it ->
if (it.isSuccessful) {
CoroutineScope(Dispatchers.IO).launch {
val koors = it.await().get("starting_location").toString()
val strs = koors.split(",").toTypedArray()
val lat = strs[0].toDouble()
val lng = strs[1].toDouble()
Log.e("RoutendarstellungActivity", "Fatal $lat & $lng")
val loc = LatLng(lat, lng)
}
}
}
val startlocation = LatLng(49.7913, 9.9534)
mMap.addMarker(MarkerOptions().position(startlocation).title("Marker in Würzburg"))
mMap.moveCamera(CameraUpdateFactory.newLatLng(startlocation))
}

添加到构建中。gradle(应用):

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.2'

你的代码看起来像这样:

override fun onMapReady(googleMap: GoogleMap) = CoroutineScope(Dispatchers.IO).launch {
try {
mMap = googleMap
val routenuebergabe = intent.getStringExtra("tourname").toString()
val snapshot = Firebase.firestore.collection("Routen")
.document(routenuebergabe)
.get()
.await()
val koors = snapshot.get("starting_location").toString()
val strs = koors.split(",").toTypedArray()
val lat = strs[0].toDouble()
val lng = strs[1].toDouble()
val startlocation = LatLng(lat, lng)
mMap.addMarker(MarkerOptions().position(startlocation).title("Marker in Würzburg"))
mMap.moveCamera(CameraUpdateFactory.newLatLng(startlocation))
} catch (e: Exception) {
// Do something...
}
}

如果只需要从UI线程调用GoogleMap方法,则可能需要包装它们:

withContext(Dispatchers.Main) {
mMap.addMarker(MarkerOptions().position(startlocation).title("Marker in Würzburg"))
mMap.moveCamera(CameraUpdateFactory.newLatLng(startlocation))
}

最新更新