首页 > 解决方案 > 如何在 ViewModel 中获取上下文

问题描述

我正在为我的应用程序使用 MVVM。我想以更好的方式在我的视图模型或存储库中获取上下文。

假设我有 UserRepository() 类

public class UserRepository {
    UserDao userDao;
    Executor executor;

    public UserRepository() {
        this.userDao = AppDatabase.getAppDatabase(MApplication.context).userDao();
        executor = Executors.newSingleThreadExecutor();
    }

    public void clearUserCached() {
        executor.execute(() -> {
            userDao.deleteAll();
        });
    }

    public void loginUser(String email, String password) {

        getAPIService().login(new LoginRequest(email, password))
            .compose(RxUtils.applySchedulers())
            .subscribe(
                (LoginResponse response) -> {
                    executor.execute(() -> {
                        userDao.insert(response.getUser());
                    });
                },
                (Throwable e) -> {
                    e.printStackTrace();
                }
            );
    }

    public LiveData<User> getUser() {
        return userDao.getUser();
    }
}

我知道使用MApplication.context不是一个好方法。这是内存泄漏。

获取上下文的另一种方法是什么?

注意:我没有使用 Dagger2

标签: androidmvvmviewmodel

解决方案


在您的构造函数中,添加一个 Context 参数,然后,当您想要使用此类时,将上下文传递给它并在 viewModel 中的任何位置使用该上下文。像这样:

 Context context;
 public UserRepository(Context context) {
    this.userDao = AppDatabase.getAppDatabase(MApplication.context).userDao();
    executor = Executors.newSingleThreadExecutor();
    context.this = context;
}

并假设您的主要活动正在使用 UserRepository 类:

UserRepository userRepository = new UserRepository(MatinActivity.this);

然后,您的 UserRepository 类中有上下文,您可以使用它。


推荐阅读