安卓调解器直播数据将2个直播数据合并成一个流和一个触发器。

问题描述 投票:2回答:1

我有2个实时数据,我将它们作为源添加到一个mediator实时数据中,我从一个视图模型中暴露出这个数据,让一个片段来观察。

当任何一个实时数据发生变化时,它都会触发mediator实时数据的onChanged方法,这意味着我的观察者会被触发两次,我想要的是将两者结合起来,只观察一个只触发一次的流,我是否有遗漏的地方,或者我是否需要为此推出我自己的方法? 目前我这样做,它触发了两次。

为保证安全,删除了一些代码。

public CardViewModel(@NonNull Application application , int clicks, String[] cardArgs){
    sentenceRepository = new SentenceRepository(application);
    cards = Transformations.switchMap(search, mySearch -> sentenceRepository.searchLiveCardListByWordTypeAndWordDescriptionAndSearchWord(cardArgs[0],cardArgs[1],mySearch));
    groupRepository = new GroupRepository(application);
    groups = groupRepository.getGroupsByWordDescriptionAndWordType(cardArgs[0],cardArgs[1]);
    sentencesAndGroups = new MediatorLiveData<>();

    sentencesAndGroups.addSource(cards, sentences -> {
        Log.d(TAG,"addSource cards");
        sentencesAndGroups.setValue(combineLatest(sentences, groups.getValue()));
    });

    sentencesAndGroups.addSource(groups, groupsWithSentences -> {
        Log.d(TAG,"addSource groups");
        sentencesAndGroups.setValue(combineLatest(cards.getValue(), groupsWithSentences));
    });

}

private List<Visitable> combineLatest(List<Sentence> sentenceList, List<GroupsWithSentences> groupsWithSentences) {
    List<Visitable> visitableList = new ArrayList<>();
    if (sentenceList != null){
        visitableList.addAll(sentenceList);
    }
    if (groupsWithSentences != null){
        visitableList.addAll(groupsWithSentences);
    }
    return visitableList;
}

任何帮助?

android android-livedata android-viewmodel mediatorlivedata
1个回答
0
投票

你可以使用一个 BiFunction. 在我的项目中,我有一个包含这个的类。

public class MultipleLiveDataTransformation {
    @MainThread
    public static <X, Y, O> LiveData<O> biMap(LiveData<X> data1, LiveData<Y> data2, final BiFunction<X, Y, O> biFun) {
        final MediatorLiveData<O> result = new MediatorLiveData<>();
        result.addSource(data1, x -> result.setValue(biFun.apply(x, data2.getValue())));
        result.addSource(data2, y -> result.setValue(biFun.apply(data1.getValue(), y)));

        return result;
    }
}

你可以像这样使用它。

public LiveData<Visitable> getVisitables() {
    return MultipleLiveDataTransformation.biMap(groups, sentences, (gro, sen) -> {
        List<Visitable> visitableList = new ArrayList<>();
        if (gro != null) {
            visitableList.addAll(gro);
        }
        if (sen != null) {
            visitableList.addAll(sen);
        }
        return visitableList;
    });
}

我不完全明白你有什么列表,你想观察什么。我在这里给出的例子可以观察两个 LiveData 对象,并在其中一个对象需要更新时触发。它总是会给你提供最新版本的 Visitable 对象。

如果我不明白这个问题,你能解释一下什么是 LiveData 对象需要组合,结果是什么?

在这种情况下,一个额外的 LiveData 的对象中需要观察 MultipleDataTransformation,它可以使 triMap.

编辑:你可以试试这个。

public LiveData<Visitable> getVisitables() {
    return MultipleLiveDataTransformation.biMap(groups, sentences, (gro, sen) -> {
        List<Visitable> visitableList = new ArrayList<>();
        if (gro != null && !gro.isEmpty() && sen != null && !sen.isEmpty()) {
            visitableList.addAll(gro);
            visitableList.addAll(sen);
        }
        return visitableList;
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.