使用livedata进行Zip 4或更多异步调用

user3354265:

有没有可能使用livedata并行运行多个异步调用的方式?

假设我有4个异步调用。我想等到一切都完成后再相应地使用所有4个调用的结果。

我能想到的一种方法是

public class MakeParallel {
    private final CountDownLatch countDown = new CountDownLatch(4);

    public void firstCall() {
        Transformation.map(makeFirstCall(), input -> {
            if(input.isSuccessful()) {
                countDownLatch.countDown();
                checkResult();
            }
            return input;
        } 
    }

    public void secondCall() {
        Transformation.map(makeSecondCall(), input -> {
            if(input.isSuccessful()) {
                countDownLatch.countDown();
                checkResult();
            }
            return input;
        } 
    }

    void checkResult() {
        if(countDownLatch.getCount == 0) {
            // Result is ready
        } else {
            // Something has error
        }
    }
}

有没有更好的方法来解决这种情况?

Oleksiy Martynov:

因此,诀窍是使用MediatorLiveData并让其观察每个LiveData对象并将更改压缩为某种类型的集合。

public static LiveData<ArrayList<Object>> zipLiveData(LiveData<Object>... liveItems){
    final ArrayList<Object> zippedObjects = new ArrayList<>();
    final MediatorLiveData<ArrayList<Object>> mediator = new MediatorLiveData<>();
    for(LiveData<Object> item: liveItems){
        mediator.addSource(item, new Observer<Object>() {
            @Override
            public void onChanged(@Nullable Object o) {
                if(!zippedObjects.contains(o)){
                    zippedObjects.add(o);
                }
                mediator.setValue(zippedObjects);
            }
        });
    }
    return mediator;
}

或在科特林:

fun zipLiveData(vararg liveItems: LiveData<*>): LiveData<ArrayList<Any>> {
return MediatorLiveData<ArrayList<Any>>().apply {
    val zippedObjects = ArrayList<Any>()
    liveItems.forEach {
        addSource(it, { item ->
            if (! zippedObjects.contains(item as Any)) {
                zippedObjects.add(item)
            }
            value = zippedObjects
        })
    }
}}

此解决方案没有类型安全性。随意定制您的需求!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章