我有一个项目,我已经成功实现了位置跟踪功能,并且工作正常。我每30秒使用融合位置提供程序跟踪用户当前位置。(MainActivity启动时跟踪开始)。
现在我计划用新引入的android架构组件更新该项目。但我不知道如何使用视图模型实现位置跟踪。在MainActivity或Application类中,是否有正确的位置来开始位置跟踪?我应该使用ViewModel还是AndroidViewModel?如何实现这一目标。
正确的方法是使用TrackingRepository
,在设备位置的后台线程中进行所有计算。创建一个MutableLiveData
,您将在其中分配位置。然后使用postValue()
或setValue()
更新其值。为这个MutableLiveData
写一个公共的吸气剂。此存储库将是您的位置API。
然后你的ViewModel
应该调用你的存储库的方法,并将其结果分配给LiveData
的ViewModel
变量。然后在你的片段/活动中观察你的ViewModel
的liveData。就像Guide to App Architecture一样。
请记住使用依赖注入,它真正有助于新架构。
经过几个小时的尝试,我终于找到了解决方案。
首先在LocationRepository中创建一个变量。
val currentLocation = MutableLiveData<Location>()
在LocationCallBack(onLocationResult)内
currentLocation.postValue(locationResult.lastLocation)
此后再次在ViewModel类中
val currentLocation = MutableLiveData<Location>()
和
fun currentLocation(): MutableLiveData<Location>
{
currentLocation = myLocationProvider.currentLocation
return currentLocation
}
至少你已经在Activity / Fragment中观察了ViewModel的MutableLiveDate
myLocationProvider.currentLocation.observe(this, Observer { currentLocation ->
currentLocation?.let {
//Your code here
}
})
编辑您必须使用suspendCoroutine,GlobalScope和UiDispatcher启动LocationCallback。