Java MVVM-获取模型类中的上下文
我正在使用MVVM构建我的Android应用程序,我需要将模型连接到DB。我使用的不是Room,而是SQLiteOpenHelper,为了连接到数据库,我需要上下文。但由于这是一门非活动课,我很难得到它。 我当前的解决方案如下所示,但我一直收到内存泄漏警告Java MVVM-获取模型类中的上下文,java,android,mvvm,android-sqlite,viewmodel,Java,Android,Mvvm,Android Sqlite,Viewmodel,我正在使用MVVM构建我的Android应用程序,我需要将模型连接到DB。我使用的不是Room,而是SQLiteOpenHelper,为了连接到数据库,我需要上下文。但由于这是一门非活动课,我很难得到它。 我当前的解决方案如下所示,但我一直收到内存泄漏警告 public class MyApplication extends Application { private static MyApplication mContext; @Override public v
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模式中的
依赖项反转
规则。因此,您应该使用构造函数注入或类似于Dagger
的框架来实现依赖项注入
模式,以将上下文
传递到您的模型层。内存泄漏也是因为违反了此规则,并且通过实施依赖项注入,不需要在不同的层中使用具有多个访问权限的全局变量,这可能会导致内存泄漏。您可以使用Factory将上下文传递给ViewModel,例如:
public class ViewModelClass extends ViewModel{
private Context context;
public ViewModelClass(Context context){
this.context = context;
}
}
工厂班呢
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 = ViewModelProviders.of(this, viewModelFactory).get(ViewModelClass.class)
我了解DI是如何工作的,但我如何将上下文传递给模型?您可以将其从视图传递给ViewModel,然后在ViewModel中使用构造函数甚至方法参数将其传递给模型。此外,您还可以使用像Dagger这样的依赖注入框架直接注入它@dmak2709My repository类是一个单独的类,所以我仍然得到相同的警告…有时Android Studio只是显示警告,而不考虑您的使用情况。尤其是在使用静态全局对象时。使用LeakCanary库检查或抑制内存泄漏@dmak2709Yes如果只在一个方法中使用它,则将其作为方法参数而不是构造函数传递@dmak2709
viewModel = ViewModelProviders.of(this, viewModelFactory).get(ViewModelClass.class)