Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewModel未随数据更改而更新_Android_Kotlin_Mvvm_Observable - Fatal编程技术网

Android 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

所以,这是我第一次在Android中使用架构组件。我正在尝试创建一个ViewModel,它将不断返回UI元素可以使用的最新位置。我创建了一个viewModel,如下所示:

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