如何使用新的架构组件跟踪android中的当前位置?

时间:2017-12-03 15:09:31

标签: android fusedlocationproviderapi android-architecture-components android-livedata android-viewmodel

我有一个项目,我已经成功实现了位置跟踪功能,并且工作正常。我每30秒使用融合位置提供程序跟踪用户当前位置。(当MainActivity启动时跟踪开始)。

现在我计划用新引入的android架构组件更新该项目。但我不知道如何使用视图模型实现位置跟踪。在 MainActivity或Application 类中,是否有正确的位置来开始位置跟踪?我应该使用 ViewModel还是AndroidViewModel ?如何实现这一点。

2 个答案:

答案 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。