MVVM - 在模型中获取上下文 class
MVVM - get context in a Model class
我正在使用 MVVM 构建我的 Android 应用程序,我需要将模型连接到数据库。我使用 SQLiteOpenHelper 而不是 Room 并连接到我需要上下文的数据库。但由于这不是 activity class 我很难得到它。
我当前的解决方案如下所示,但我不断收到内存泄漏警告。
public class MyApplication extends Application {
private static MyApplication mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static MyApplication getContext() {
return mContext;
}
}
有更好的解决方案或最佳做法吗?
编辑:不使用 Dagger
您的解决方案有效,但您违反了 MVVM 模式中的 Dependency Inversion
规则。因此,您应该使用构造函数注入或 Dagger
之类的框架来实现 Dependency Injection
模式,以将 context
传递给您的模型层。您的内存泄漏也是因为违反了此规则,并且通过实施依赖注入,不需要在不同层中进行多次访问的全局变量,这可能会导致内存泄漏。
您可以使用 Factory 将上下文传递给 ViewModel,例如:
public class ViewModelClass extends ViewModel{
private Context context;
public ViewModelClass(Context context){
this.context = context;
}
}
和工厂class
public class ViewModelFactory implements ViewModelProvider.Factory{
private Context context;
public ViewModelFactory(Context context){
this.context = context;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
if (modelClass.isAssignableFrom(ViewModelClass.class)) {
return (T) new ViewModelClass(context);
}
throw new IllegalArgumentException("Unknown ViewModel class");
}
}
并且当您使用 ViewModel 时定义工厂
ViewModelFactory viewModelFactory = new ViewModelFactory(context);
然后像这样传递:
viewModel = ViewModelProviders.of(this, viewModelFactory).get(ViewModelClass.class)
我正在使用 MVVM 构建我的 Android 应用程序,我需要将模型连接到数据库。我使用 SQLiteOpenHelper 而不是 Room 并连接到我需要上下文的数据库。但由于这不是 activity class 我很难得到它。
我当前的解决方案如下所示,但我不断收到内存泄漏警告。
public class MyApplication extends Application {
private static MyApplication mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static MyApplication getContext() {
return mContext;
}
}
有更好的解决方案或最佳做法吗?
编辑:不使用 Dagger
您的解决方案有效,但您违反了 MVVM 模式中的 Dependency Inversion
规则。因此,您应该使用构造函数注入或 Dagger
之类的框架来实现 Dependency Injection
模式,以将 context
传递给您的模型层。您的内存泄漏也是因为违反了此规则,并且通过实施依赖注入,不需要在不同层中进行多次访问的全局变量,这可能会导致内存泄漏。
您可以使用 Factory 将上下文传递给 ViewModel,例如:
public class ViewModelClass extends ViewModel{
private Context context;
public ViewModelClass(Context context){
this.context = context;
}
}
和工厂class
public class ViewModelFactory implements ViewModelProvider.Factory{
private Context context;
public ViewModelFactory(Context context){
this.context = context;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
if (modelClass.isAssignableFrom(ViewModelClass.class)) {
return (T) new ViewModelClass(context);
}
throw new IllegalArgumentException("Unknown ViewModel class");
}
}
并且当您使用 ViewModel 时定义工厂
ViewModelFactory viewModelFactory = new ViewModelFactory(context);
然后像这样传递:
viewModel = ViewModelProviders.of(this, viewModelFactory).get(ViewModelClass.class)