Как мне получить контекст во ViewModel - PullRequest
0 голосов
/ 13 сентября 2018

Я использую 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 голосов
/ 13 сентября 2018

В вашем конструкторе добавьте параметр 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, и вы можете использовать его.

...