代码之家  ›  专栏  ›  技术社区  ›  varunkr

MediatorLiveData onChanged未被调用

  •  3
  • varunkr  · 技术社区  · 7 年前

        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");
                            }
                        });
    
                    });
    

    首先,我尝试向数据库中插入一个新的内容对象。我在下一行中记录插入对象的id。我有一些身份证,这是好的。在此之后,我使用id查询同一个对象。查询返回一个LiveData。( )

    MediatorLiveData . 不幸的是,mediatorLiveData的onChange方法从未触发。因此日志也不会被打印出来。

    @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 回复  |  直到 7 年前
        1
  •  24
  •   Chris    7 年前

    如前所述,您需要确保mediatorLiveData附加了一个活动的观察者。

    如果查看addSource方法,它会在订阅源之前检查是否附加了任何活动的观察者。

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

    推荐文章