我有一个项目,我已经成功实现了位置跟踪功能,并且工作正常。我每30秒使用融合位置提供程序跟踪用户当前位置。(当MainActivity启动时跟踪开始)。
现在我计划用新引入的android架构组件更新该项目。但我不知道如何使用视图模型实现位置跟踪。在 MainActivity或Application 类中,是否有正确的位置来开始位置跟踪?我应该使用 ViewModel还是AndroidViewModel ?如何实现这一点。
答案 0 :(得分:2)
正确的方法是让TrackingRepository
在设备位置的后台线程中进行所有计算。创建一个MutableLiveData
,您将在其中分配位置。然后使用postValue()
或setValue()
更新其值。为此MutableLiveData
写一个公共getter。此存储库将是您的位置API。
然后,您的ViewModel
应调用您的存储库的方法,并将其结果分配给LiveData
的{{1}}变量。然后在Fragment / Activity中观察ViewModel
的liveData。就像Guide to App Architecture一样。
请记住使用依赖注入,它真正有助于新架构。
答案 1 :(得分:1)
经过几个小时的尝试,终于可以找到解决方法了。
首先在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。