【发布时间】:2019-09-21 18:16:39
【问题描述】:
我用来获取位置信息的FusedLocationProviderClient 需要引用活动或上下文。当我尝试在视图模型中实例化我的UserLocationService(实现FusedLocationProviderClient)时,我必须传递对活动的引用。
class UserLocationService {
public val locationUpdates: MutableLiveData<Location> = MutableLiveData()
private var fusedLocationClient: FusedLocationProviderClient
constructor(activity: Activity) {
fusedLocationClient = LocationServices.getFusedLocationProviderClient(activity)
...
我不想传递对视图模型的任何引用。在这种情况下,正确的方法是什么?我可以直接在片段中使用UserLocationService,但我的理解是,视图模型应该进行实例化和初始化。
【问题讨论】:
-
但是如何获取
UserLocationService内部的上下文呢? -
从架构的角度来看,我不知道那是什么。如果它是存储库或其他单例,您可以在创建它时提供
Application单例(例如,通过依赖倒置)。如果它只是视图模型正在使用的实用程序类,如一个答案所示,请使用AndroidViewModel作为视图模型的基类。然后,您可以访问getApplication()以获取Application单例。 -
这只是一个存储库类。我已经从
androidx.lifecycle.AndroidViewModel实现了AndroidViewModel类,但getApplication()还需要一个活动作为参考,如getApplication<activity: Activity>() -
“但 getApplication() 还需要一个活动作为参考”——不,它不需要。它返回
T,其中T扩展自Application。 This sample project 演示了AndroidViewModel的使用,this project、this project 和 this project 也是如此。
标签: android reference viewmodel android-architecture-components fusedlocationproviderclient