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

问题描述 投票:1回答:2

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

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

android fusedlocationproviderapi android-architecture-components android-livedata android-viewmodel
2个回答
3
投票

正确的方法是使用TrackingRepository,在设备位置的后台线程中进行所有计算。创建一个MutableLiveData,您将在其中分配位置。然后使用postValue()setValue()更新其值。为这个MutableLiveData写一个公共的吸气剂。此存储库将是您的位置API。

然后你的ViewModel应该调用你的存储库的方法,并将其结果分配给LiveDataViewModel变量。然后在你的片段/活动中观察你的ViewModel的liveData。就像Guide to App Architecture一样。

请记住使用依赖注入,它真正有助于新架构。


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。

© www.soinside.com 2019 - 2024. All rights reserved.