java– 使用livedata压缩4个或更多异步调用

java– 使用livedata压缩4个或更多异步调用,第1张

概述是否有任何可能的方法使用livingata并行运行多个异步调用?假设我有4个异步调用.我想等到一切都完成后再使用所有4个调用的结果.我能想到的一种方法就是这样publicclassMakeParallel{privatefinalCountDownLatchcountDown=newCountDownLatch(4);publicvoid

是否有任何可能的方法使用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个或更多异步调用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1104730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存