Android студии не удалось разрешить AsyncTask

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

0
задан Fantômas 18 January 2019 в 18:59
поделиться