Android ViewModel未随数据更改而更新
所以,这是我第一次在Android中使用架构组件。我正在尝试创建一个ViewModel,它将不断返回UI元素可以使用的最新位置。我创建了一个viewModel,如下所示:Android ViewModel未随数据更改而更新,android,kotlin,mvvm,observable,Android,Kotlin,Mvvm,Observable,所以,这是我第一次在Android中使用架构组件。我正在尝试创建一个ViewModel,它将不断返回UI元素可以使用的最新位置。我创建了一个viewModel,如下所示: class LocationViewModel(application: Application) : AndroidViewModel(application) { val currentLocation = MutableLiveData<Location?>() in
class LocationViewModel(application: Application) : AndroidViewModel(application) {
val currentLocation = MutableLiveData<Location?>()
init {
val ctx = getApplication<Application>().applicationContext
val fusedLocationProvider = LocationServices.getFusedLocationProviderClient(ctx)
val locationRequest = LocationRequest.create()
locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
locationRequest.interval = 5000
locationRequest.fastestInterval = 2000
val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
val client = LocationServices.getSettingsClient(ctx)
client.checkLocationSettings(builder.build()).addOnFailureListener {
currentLocation.postValue(null)
}
val locationCallback = object : LocationCallback() {
override fun onLocationResult(p0: LocationResult?) {
super.onLocationResult(p0)
p0 ?: return
currentLocation.postValue(p0.lastLocation)
}
}
fusedLocationProvider.requestLocationUpdates(
locationRequest,
locationCallback,
Looper.getMainLooper()
)
}
}
TextView甚至不会更新一次。这样的事情应该怎么做?我做错了什么 在视图模型中创建这样的函数
fun initdata() {
val ctx = getApplication<Application>().applicationContext
val fusedLocationProvider = LocationServices.getFusedLocationProviderClient(ctx)
val locationRequest = LocationRequest.create()
locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
locationRequest.interval = 5000
locationRequest.fastestInterval = 2000
val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
val client = LocationServices.getSettingsClient(ctx)
client.checkLocationSettings(builder.build()).addOnFailureListener {
currentLocation.postValue(null)
}
val locationCallback = object : LocationCallback() {
override fun onLocationResult(p0: LocationResult?) {
super.onLocationResult(p0)
p0 ?: return
currentLocation.postValue(p0.lastLocation)
}
}
fusedLocationProvider.requestLocationUpdates(
locationRequest,
locationCallback,
Looper.getMainLooper()
)
}
编辑1
你可以这样初始化
private val users:MutableLiveData<Location?> by lazy {
MutableLiveData().also {
initdata()
}
}
private val users:MutableLiveData by lazy{
MutableLiveData()。同样{
initdata()
}
}
更多详细信息请参考是否调试是否调用了currentLocation.postValue(p0.lastLocation)?我没有,但我确实认为它没有被调用可能是问题所在,请尝试更改为不同的数据输入以验证这看起来非常粗糙,文档中说,当我们需要ViewModel中的上下文时,可以使用AndroidViewModel。在这种情况下,您可以使用Edit answer
val viewModel = ViewModelProviders.of(this)[LocationViewModel::class.java]
viewModel.initdata()
private val users:MutableLiveData<Location?> by lazy {
MutableLiveData().also {
initdata()
}
}