Java MVVM-获取模型类中的上下文

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

我正在使用MVVM构建我的Android应用程序,我需要将模型连接到DB。我使用的不是Room,而是SQLiteOpenHelper,为了连接到数据库,我需要上下文。但由于这是一门非活动课,我很难得到它。

我当前的解决方案如下所示,但我一直收到内存泄漏警告

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)