位置返回的异步操作

时间:2018-03-30 08:27:07

标签: android kotlin

我已经使用以下代码返回位置,但显然返回是在返回位置之前执行的,我该如何推迟它以确保它在正确的时间返回:

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
    }
}

1 个答案:

答案 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")
}