Android AAC-如何避免在viewmodel中引用活动

Android AAC-如何避免在viewmodel中引用活动,android,reference,viewmodel,android-architecture-components,fusedlocationproviderclient,Android,Reference,Viewmodel,Android Architecture Components,Fusedlocationproviderclient,我用来获取位置信息的FusedLocationProviderClient需要对活动或上下文的引用。当我尝试在viewmodel中实例化我的UserLocationService——它实现了FusedLocationProviderClient——时,我必须传递对活动的引用 class UserLocationService { public val locationUpdates: MutableLiveData<Location> = MutableLiveData() priv

我用来获取位置信息的
FusedLocationProviderClient
需要对活动或上下文的引用。当我尝试在viewmodel中实例化我的
UserLocationService
——它实现了
FusedLocationProviderClient
——时,我必须传递对活动的引用

class UserLocationService {
public val locationUpdates: MutableLiveData<Location> = MutableLiveData()
private var fusedLocationClient: FusedLocationProviderClient
constructor(activity: Activity) {
    fusedLocationClient = LocationServices.getFusedLocationProviderClient(activity)
...
private val myViewModel: MyViewModel by lazy {
    ViewModelProviders.of(this).get(MyViewModel::class.java)
}
class UserLocationService{
public val locationUpdates:MutableLiveData=MutableLiveData()
私有变量fusedLocationClient:FusedLocationProviderClient
构造函数(活动:活动){
fusedLocationClient=LocationServices.getFusedLocationProviderClient(活动)
...
我不想传递任何对viewmodel的引用。在这种情况下,正确的方法是什么?我可以直接在片段中使用
UserLocationService
,但我的理解是,viewmodel应该进行实例化和初始化。

您应该使用

编辑:

因此,您可以做的是使用视图模型类

class MyViewModel(application: Application) : AndroidViewModel(application) {
    private val context = application.applicationContext

}
然后根据你的需要使用上下文

要初始化视图模型,可以在活动中执行类似操作

class UserLocationService {
public val locationUpdates: MutableLiveData<Location> = MutableLiveData()
private var fusedLocationClient: FusedLocationProviderClient
constructor(activity: Activity) {
    fusedLocationClient = LocationServices.getFusedLocationProviderClient(activity)
...
private val myViewModel: MyViewModel by lazy {
    ViewModelProviders.of(this).get(MyViewModel::class.java)
}
然后在
onCreate()之后使用它。您应该使用

编辑:

因此,您可以做的是使用视图模型类

class MyViewModel(application: Application) : AndroidViewModel(application) {
    private val context = application.applicationContext

}
然后根据你的需要使用上下文

要初始化视图模型,可以在活动中执行类似操作

class UserLocationService {
public val locationUpdates: MutableLiveData<Location> = MutableLiveData()
private var fusedLocationClient: FusedLocationProviderClient
constructor(activity: Activity) {
    fusedLocationClient = LocationServices.getFusedLocationProviderClient(activity)
...
private val myViewModel: MyViewModel by lazy {
    ViewModelProviders.of(this).get(MyViewModel::class.java)
}

然后在
onCreate()之后使用它

如果您愿意通过通知来处理错误案例,那么有。但是如何在
UserLocationService
中获取上下文呢?从架构的角度来看,我不知道这是什么。如果它是存储库或其他单例,您可以在创建它时为它提供
应用程序
单例(例如,通过依赖项反转)。如果它只是viewmodel使用的一个实用程序类,如一个答案所示,请使用
AndroidViewModel
作为viewmodel的基类。然后,您可以访问
getApplication()
获取
应用程序
单例。这只是一个响应类。我已经从
androidx.lifecycle.AndroidViewModel实现了
AndroidViewModel
类。AndroidViewModel
但是
getApplication()
还需要一个活动作为引用,比如
getApplication()
“但是getApplication()还需要一项活动作为参考”--不,它没有。它返回
T
,其中
T
应用程序
扩展而来。演示了
AndroidViewModel
的使用,以及。如果您愿意通过通知来处理错误情况,则有。但是如何在
UserLocationService
中获取上下文?我不知道这是什么,从架构的观点。如果它是一个存储库或一些其他单例,您可以在创建它时为它提供
应用程序
单例(例如,通过依赖项反转)。如果它只是viewmodel使用的一个实用程序类,如一个答案所示,请使用
AndroidViewModel
作为viewmodel的基类。然后,您可以访问
getApplication()
获取
应用程序
单例。这只是一个响应类。我已经从
androidx.lifecycle.AndroidViewModel实现了
AndroidViewModel
类。AndroidViewModel
但是
getApplication()
还需要一个活动作为引用,比如
getApplication()
“但是getApplication()还需要一项活动作为参考”--不,它没有。它返回
T
,其中
T
Application
扩展而来。演示了
AndroidViewModel
的使用,我也演示了。我有一个如何使用它的示例吗?这个类需要在构造函数中引用应用程序上下文。我有一个如何使用它的示例吗?这个类需要一个引用ce到构造函数中的应用程序上下文。