我已经使用以下代码返回位置,但显然返回是在返回位置之前执行的,我该如何推迟它以确保它在正确的时间返回:
import android.annotation.SuppressLint
import android.content.Context
import android.location.Location
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import oryx.tecna.locateme.extensons.toast
private lateinit var fusedLocationClient: FusedLocationProviderClient
object UtilLocation {
private lateinit var l : Location
@SuppressLint("MissingPermission")
fun getLocation(context: Context) : Location{
context.toast("mlocation is called")
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context!!)
fusedLocationClient.lastLocation
.addOnSuccessListener { location : Location? ->
this.l = location!!
// context.toast("my location is: ${location?.latitude}")
}
return this.l
}
}
答案 0 :(得分:-2)
显然返回是在返回位置之前执行的
是。在这种情况下,特别是在kotlin中,您可以定义higher-order function。这是一个将函数作为参数的函数。这样做是为了使位置侦听器可以在检索位置时调用该函数。调用此getLocation
函数的代码将能够定义在调用该函数(作为参数传递的函数)时要执行的操作。
您还可以删除返回类型和值,因为信息现在将通过该函数传递。看起来像这样。请注意getLocation
的第二个参数和callback.invoke(this.l)
object UtilLocation {
private lateinit var l : Location
@SuppressLint("MissingPermission")
fun getLocation(context: Context, callback: (Location) -> Unit) {
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context!!)
fusedLocationClient.lastLocation
.addOnSuccessListener { location : Location? ->
this.l = location!!
// context.toast("my location is: ${location?.latitude}")
callback.invoke(this.l)
}
}
}
然后你这样称呼它
UtilLocation.getLocation(context, { location ->
Log.d("tag", "got location")
})
或because the last parameter is a function,如果您愿意,可以这样做
UtilLocation.getLocation(context) { location ->
Log.d("tag", "got location")
}