Android 正在异步执行Observable.zip()

Android 正在异步执行Observable.zip(),android,retrofit,rx-java,Android,Retrofit,Rx Java,我正在编写一个Android应用程序,使用RxJava、改进和干净的体系结构。问题是我有一个交互器/用例,需要返回最喜欢的团队和最喜欢的玩家的集合。最喜欢的团队的集合是一个端点与另一个端点混合的结果。最喜欢的球员也是如此。在Interactor/UseCase实现中,我做了如下工作: getTeams = Observable.merge(mNetworkRetrofitService.getAllTeams(), mNetworkRetrofitService.getAllFavoriteTe

我正在编写一个Android应用程序,使用RxJava、改进和干净的体系结构。问题是我有一个交互器/用例,需要返回最喜欢的团队和最喜欢的玩家的集合。最喜欢的团队的集合是一个端点与另一个端点混合的结果。最喜欢的球员也是如此。在Interactor/UseCase实现中,我做了如下工作:

getTeams = Observable.merge(mNetworkRetrofitService.getAllTeams(), mNetworkRetrofitService.getAllFavoriteTeams());
getPlayers = Observable.merge(mNetworkRetrofitService.getAllPlayers(), mNetworkRetrofitService.getAllFavoritePlayers());
然后,我将这两个响应压缩在一起,并在单个包装器对象中返回它们:

Observable.zip(getTeams, getPlayers, new Func2<List<Team>, List<Player>, Pair<List<Team>, List<Player>>>() {
    @Override
    public Pair<List<Team>, List<Player>> call(List<Team> teamList, List<Player> players) {
        return new Pair<>(teamList, players);
    }
}).subscribe(new DefaultSubscriber<Pair<List<Team>, List<Player>>>() {

    @Override
    public void onNext(Pair<List<Team>, List<Player>> pair) {
        callback.showResultOnUI(pair);
    }

});
Observable.zip(getTeams、getPlayers、newfunc2(){
@凌驾
公共配对呼叫(列出团队列表,列出玩家){
返回新的一对(团队列表、玩家);
}
}).subscribe(新的DefaultSubscriber(){
@凌驾
public void onNext(对){
callback.showResultOnUI(成对);
}
});
我知道.zip()方法应该等到两个rx.Observable结束发送项目,但在这种情况下,混合方法被执行了不止一次

我的问题是,;有没有办法防止zip的合并方法被多次执行

请记住以下几点:

  • 我简化了这个例子。实际上,我还将一个缓存rx.Observable与改装的rx.Observable合并

  • 端点无法更改。包装器对象无法更改。响应必须在单个对象包装器中返回到te UI。我们不能用两种不同的回调方法发送喜爱的球队和喜爱的球员


因此,您的
zip
方法会被多次调用,因为您操作的是
List
s。这意味着可观察到:

getTeams = Observable.merge(
      mNetworkRetrofitService.getAllTeams(), 
      mNetworkRetrofitService.getAllFavoriteTeams());
将有2个项目,每个项目都有一个列表-它不会将它们全部合并在一起。您需要将两个列表合并为一个:

getTeams = Observable.merge(
      mNetworkRetrofitService.getAllTeams(), 
      mNetworkRetrofitService.getAllFavoriteTeams())
.flatMap(Observable::fromIterable()
.toList();

如果您对两个
zip
参数都这样做,那么您将只得到一个排放。

您可能可以使用startWith()将一个空的东西传递给下游。和一个你已经拥有的团队合作。当你完成异步任务时,传递新的一个。对不起,我不明白,你能再解释一下吗?
getAllTeams
getAllFavoriteTeams
返回
Observable
,然后是“玩家”。(我认为实际上
Observable
按名字来说是
单一的所以多次执行的混合方法是正确的。事实上,它将被执行4次。太棒了!我要试试看。不使用lambdas的版本会是怎样的呢?特别是
.flatMap(Observable::fromIterable()
行。好吧,进行迭代扩展-
。flatMap(Observable::fromIterable)
变成
.flatMap(o->Observable.fromIterable(o))
,成为
.flatMap(新Func1hahaha是的,我知道,但我们有大量的遗留代码,我们正在努力改进,使用lambdas仍然是一个待定的里程碑。