我正在嘗試制作一個 android 谷歌地圖應用程式,但我遇到了我在偵聽器內部分配值的全域變數沒有完成的問題。在這種情況下,我試圖在此處設定標記后存盤設備的當前位置,并且檔案說要使用偵聽器。問題是,在偵聽器完成后,值會重置為之前的值,并且我無法從偵聽器內部回傳。
這是變數,它現在不是私有的,因為我正在測驗它是否由于某種原因影響它:
lateinit var latLng : LatLng
這是導致問題的函式:
private fun setDestinations() : LatLng{
checkPermission()
var locationResult = fusedLocationProviderClient.lastLocation;
var lat = 0.0
var lng = 0.0
locationResult.addOnCompleteListener(this) { task ->
if(task.isSuccessful){
lng = locationResult.result.longitude
lat = locationResult.result.latitude
latLng = LatLng(lat, lng)
setBaseLocation(lat, lng)
/**debug**/
println("First: $lat $lng")
} else {
Toast.makeText(this, "Cannot retrieve location", Toast.LENGTH_LONG).show()
}
}
println("Third: " latLng.latitude " " latLng.latitude)
return latLng
}
當它到達回傳時我得到一個錯誤,說latLng尚未初始化
如果可以,請幫助我,我真的需要它
uj5u.com熱心網友回復:
在您的代碼locationResult.addOnCompleteListener(this) { task -> }中是一個異步回呼,一旦異步任務(獲取位置)完成,它將回傳結果。同時,您在此回呼之外的其余代碼被同步呼叫,因此它在addOnCompleteListener回呼仍在等待結果時回傳 latlng。這導致“latLng 尚未初始化”
有關同步和異步執行的更多資訊:異步與同步執行,主要區別是什么?
uj5u.com熱心網友回復:
你確定這條線
println("Third: " latLng.latitude " " latLng.latitude)沒有拋出錯誤嗎?
導致此行也使用 latLng。
作為異步回呼,在執行同步回傳之前不會初始化 latLng。這就是為什么您應該在列印行中出現錯誤。
uj5u.com熱心網友回復:
那是因為這部分在函式回傳時沒有被呼叫。
locationResult.addOnCompleteListener(this) { task ->
if(task.isSuccessful){
lng = locationResult.result.longitude
lat = locationResult.result.latitude
latLng = LatLng(lat, lng)
setBaseLocation(lat, lng)
/**debug**/
println("First: $lat $lng")
} else {
Toast.makeText(this, "Cannot retrieve location", Toast.LENGTH_LONG).show()
}
}
所以,你的方法就像
private fun setDestinations() : LatLng{
checkPermission()
return latLng
}
您應該避免回傳,或者您需要確保變數在回傳之前是否已初始化。你需要讓它同步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/469158.html
