tata88k / rxjava2-discussion

rxjava2-discussion
16 stars 2 forks source link

如何实现多个接口数据请求完成之后在做展示处理? #4

Open luoqqsh opened 7 years ago

luoqqsh commented 7 years ago

比如有一个页面,需要从3个不同的接口获取3个不同的数据进行计算后才能显示在屏幕上,那就意味着我的先保证3个接口都能正常获取到数据,不知道rxjava能否实现,怎么实现,提供下思路谢谢!可以给我个参考代码(伪代码)

tata8k commented 7 years ago

@luoqqsh 用flatmap操作符组合具有依赖关系的类型。比如,我们获取User Order逻辑是:先获取App Token , 再根据App Token去获取User Token,最后根据App Token和User Token去获取User Order

Observable<Order> orderObservable =
                getAppTokenObservable()
                        .flatMap((appToken) -> geUserTokenObservable(appToken),
                                (appToken,userToken) -> getOrderObservable(appToken,userToken));
Chenhengquan commented 7 years ago

用Zip

tgithubc commented 7 years ago

like this :

@Override
    public Observable<Hero> queryHeroDetail(Hero hero) {
        String heroId = hero.getObjectId();
        return Observable
                .zip(getSkills(heroId), getRecommends(heroId), getAttritubes(heroId), (skills, recommends, attritubes) -> {
                    hero.setAttributes(attritubes);
                    hero.setSkills(skills);
                    hero.setRecommends(recommends);
                    return hero;
                })
                .compose(RxHandler.applySchedulers());
    }

getSkills getRecommends getAttritubes 都是联网查询数据 简单来说zip操作符就是合并多个数据流, 然后发送最终合并的数据

luoqqsh commented 7 years ago

@tgithubc getSkills(heroId), getRecommends(heroId), getAttritubes(heroId),这3个是数据请求吗?有没有代码看一下,现在的网络框架都是发起请求后会自动跳到另一个listener或者通过handler返回结果,可以说发起请求写在点击事件或加载事件,而结果是写在事件外面。如何使用像getSkills(heroId),进行封装

luoqqsh commented 7 years ago

@UsherBaby geUserTokenObservable(appToken)这个代码是什么,能给我个例子吗?我想知道现在的网络获取都是发起请求和返回结果分开两个地方。怎么封装到一起,怎么写成 geUserTokenObservable(appToken)像这样的形式

tata8k commented 7 years ago

@luoqqsh 你用listener或者通过handler回掉处理网络请求结果,这种写法是异步网络请求,我的伪代码geUserTokenObservable()是同步网络请求。至于怎么写成geUserTokenObservable(appToken),我是用retrofit. 当然你也可以用同步请求数据后把结果用rxjava包裹返回。

luoqqsh commented 7 years ago

@UsherBaby 你说你用的是retrofit,能给我个例子看下怎么写吗?

tata8k commented 7 years ago

@luoqqsh

public interface GitHubService {
  @GET("users/{user}/repos")
  Observable<List<Repo>> listRepos(@Path("user") String user);

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

GitHubService service = retrofit.create(GitHubService.class);
Observable<List<Repo>> reposObservable = service.listRepos("octocat");
}

建议你自己上retrofit官网看看吧