【问题标题】:How do I get context in ViewModel [duplicate]如何在 ViewModel 中获取上下文 [重复]
【发布时间】:2019-02-17 22:45:31
【问题描述】:

我正在为我的应用程序使用 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

【问题讨论】:

标签: android mvvm viewmodel


【解决方案1】:

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

【讨论】:

  • 我认为 TS 试图将上下文传递给 viewmodel 而不是在活动中
猜你喜欢
  • 2018-12-29
  • 2020-12-24
  • 2015-07-09
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多