如何在ViewModel中获取上下文

时间:2018-09-13 08:29:31

标签: android mvvm 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

1 个答案:

答案 0 :(得分:0)

在构造函数中,添加一个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类中具有上下文,并且可以使用它。