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)