Вы используете LiveData
для извлечения пользовательских сведений, как указано в этом методе Dao
LiveData loadUserDetails(String userId);
Вы не можете напрямую вызвать getValue () на LiveData
и ожидать получить текущее значение. LiveData
необходимо, чтобы наблюдатель был рассчитан на первое место. В этом случае значение не выбирается синхронно. Вы можете найти ту же самую проблему здесь
Чтобы использовать LiveData
, вам нужно наблюдать за изменениями, передав LifecycleOwner
, как Activity
, Как они указали в Образцах архитектурных компонентов - ProductFragment
// Observe product data
model.getObservableProduct().observe(this, new Observer() {
@Override
public void onChanged(@Nullable ProductEntity productEntity) {
model.setProduct(productEntity);
}
});
Если вам нужно значение без наблюдателя, вы можете изменить тип возврата на не LiveData
, как это
UserLoginDetails loadUserDetails(String userId);
В этом случае вы не можете вызвать этот метод в основном потоке. Вы должны вызвать этот метод синхронной работы базы данных в фоновом потоке, например, используя поток Schedulers.io()
, используя RxJava
.
Возможным решением может быть использование RxJava с комнатой для возврата Flowable
данных пользователя, для Например, как показано в примерах архитектурных компонентов - UserDao.java
Измените ваш loadUserDetails для возврата Flowable
Flowable loadUserDetails(String userId);
Подпишитесь на это Flowable
например, UserViewModel.java
// Map the result to desired format
// Using RxJava operators to perform checks
// If user is null or not
public void checkUserExists(String userId) {
dao.loadUserDetails(userId)
.map(new Function() {
@Override
public Boolean apply(UserLoginDetails userLoginDetails) throws Exception {
if(userLoginDetails == null){
return false;
} else {
return true;
}
}
})
.subscribe(getObserver());
}
Таким образом, как вы получаете Flowable
, вы можете применять различные операторы для проверки ваших желаемых условий и может преобразовать этот поток в логический наблюдаемый со значением в зависимости от ваших условий. Это будет очень простой и удобный подход для этого конкретного случая использования.