是否有任何可能的方法使用livingata并行运行多个异步调用?
假设我有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 } }}
有没有更好的方法来解决这个场景?
解决方法:
因此,诀窍是使用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;}
或者在Kotlin:
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 }) }}}
该解决方案没有类型安全性.随意定制您的需求!
总结以上是内存溢出为你收集整理的java – 使用livedata压缩4个或更多异步调用全部内容,希望文章能够帮你解决java – 使用livedata压缩4个或更多异步调用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)