Как мне назначить координаты местоположения вне onsucclistener в Android (Kotlin)?

#android #kotlin #location #android-location #fusedlocationproviderclient

#Android #котлин #Расположение #android-местоположение #fusedlocationproviderclient

Вопрос:

Я пытаюсь получить местоположение устройства Android. Я следовал этим инструкциям по использованию fusedLocationClient.

Я не могу назначить переменные снаружи .addSuccessListener .

Я скажу, что журналы вне прослушивателя вызываются перед журналами внутри прослушивателя событий, поэтому я должен пытаться назначить переменные перед вызовом прослушивателя. Это имеет смысл, потому что слушатели являются асинхронными.

 override fun onMapReady() {
        var loc: Location = Location("")
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

        fusedLocationClient.lastLocation
            .addOnSuccessListener { location : Location ->
                loc = location
                Log.i("Lat, Long",loc.latitude.toString()   ", "    loc.longitude.toString()) // this correctly logs the latitude and longitude

            }

        Log.i("Lat, Long",loc.latitude.toString()   " "   loc.longitude.toString()) // this logs latitude and longitude as (0.0,0.0)
}
 

Я попытался ввести инициализацию onCreate() fusedLocationClient и использовать fusedLocationClient как частную собственность:

 
    private fusedLocationClient: FusedLocationProviderClient

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_display_map)

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

        fusedLocationClient.lastLocation
            .addOnSuccessListener { location : Location ->
                loc = location
                Log.e(loc.latitude.toString(), loc.longitude.toString())
            }
    }
 

Я также пробовал это в onResume, но все равно не повезло.

Ответ №1:

Создайте loc свойство как делегированное свойство:

 var loc: Location? by Delegates.observable(null as? Location){
        _, _, newLoc ->
       // log
}
 

Этот делегат помогает вам отслеживать любые изменения в свойстве