MediatorLiveData onChanged не вызывается - PullRequest
0 голосов
/ 19 сентября 2018

В моем приложении я пытаюсь использовать MediatorLiveData для прослушивания изменений в liveata.Поскольку задействованы операции с БД, я использую службу исполнителя, подобную этой.

    MediatorLiveData<Content> mediatorLiveData = new MediatorLiveData<>();
    appExecutors.diskIO().execute(() -> {
                    long id = contentDao.insert(content);
                    Log.i("LIVE", id + "");
                    LiveData<Content> content = contentDao.getContentById(id);

                    mediatorLiveData.addSource(content, new Observer<Content>() {
                        @Override
                        public void onChanged(@Nullable Content content) {
                            Log.i("LIVE", "FIRED");
                        }
                    });

                });

Сначала я пытаюсь вставить новый объект контента в БД.Я получаю идентификатор вставленного объекта, который я вхожу в следующую строку.Я получил какое-то удостоверение личности, и это хорошо.После этого я использую идентификатор для запроса того же объекта.Запрос возвращает LiveData.( Если я использую content.getValue () в это время, я получаю нулевое значение. )

Затем я слушаю изменения в этих liveData, используя MediatorLiveData.К сожалению, метод onChange mediatorLiveData никогда не запускается.Таким образом, журнал тоже не печатается.

Это мой контент дао класс

@Dao
public interface ContentDao {

    @Insert
    long insert(Content content);

    @Query("SELECT * FROM my_table WHERE id = :id")
    LiveData<Content> getContentById(long id);
}

Я не могу понять, что я делаю неправильно.Может кто-нибудь, пожалуйста, помогите.Спасибо !!

Редактировать: чтобы уточнить, как выглядит код.

return new NetworkBoundResource<Content, CreateContent>(appExecutors) {
    @Override
    protected void saveCallResult(@NonNull CreateContent item) {
       //Something
    }

    @Override
    protected boolean shouldCall(@Nullable Content data) {
        //Something;
    }

    @Override
    protected LiveData<Content> createDbCall() {
        MediatorLiveData<Content> mediatorLiveData = new MediatorLiveData<>();
        appExecutors.diskIO().execute(() -> {
                    long id = contentDao.insert(content);
                    Log.i("LIVE", id + "");
                    LiveData<Content> content = contentDao.getContentById(id);

                    mediatorLiveData.addSource(content, new Observer<Content>() {
                        @Override
                        public void onChanged(@Nullable Content c) {
                            Log.i("LIVE", "FIRED");                                                
                            mediatorLiveData.removeSource(content);
                            mediatorLiveData.postValue(c);
                        }
                    });

            });
        return mediatorLiveData;
    }

    @NonNull
    @Override
    protected LiveData<ApiResponse<CreateContent>> createCall() {
        //Something
    }
}.asLiveData();

Значение возвращается конструктору.

@MainThread
    public NetworkBoundResource(AppExecutors appExecutors) {
        this.appExecutors = appExecutors;
        result.setValue(Resource.loading(null));
        //TODO:: Add method to check if data should be saved. This should apply for search data.
        LiveData<ResultType> dbSource = createDbCall();
        result.addSource(dbSource, data -> {
            result.removeSource(dbSource);
            if (shouldCall(data)) {
                fetchFromNetwork(dbSource);
            } else {
                result.addSource(dbSource, newData -> setValue(Resource.success(newData)));
            }
        });
    }

1 Ответ

0 голосов
/ 19 сентября 2018

Как уже говорилось, вам нужно убедиться, что к mediatorLiveData подключен активный наблюдатель.

Если вы посмотрите на метод addSource, он проверяет, подключены ли какие-либо активные наблюдатели, прежде чем подписываться на источник.

https://github.com/aosp-mirror/platform_frameworks_support/blob/d79202da157cdd94c2d0c0b6ee57170a97d12c93/lifecycle/livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java#L95

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...