[Android]对多个网络请求结果统一处理的实现方式(Rxjava2、协程双版本)

868 阅读1分钟

直接上代码,看注释:

首先是rxjava版本,两种方式根据实际场景自行选择

//rxjava+retrofit网络请求
Observable<User> userObservable = apiService.getUser("username");
Observable<List<Repo>> repoObservable = apiService.listRepos("username");

//方式一:
Observable.zip(userObservable, repoObservable, new BiFunction<User, List<Repo>, Object>() {
    @Override
    public Object apply(User user, List<Repo> repos) throws Exception {
        // 在这里对两个 Observable 的结果进行合并和处理
        return null;
    }
}).subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Observer<Object>() {
    @Override
    public void onSubscribe(Disposable d) {
        // 连接建立时调用
    }

    @Override
    public void onNext(Object o) {
        // 在 zip 操作符的回调中对结果进行统一处理
    }

    @Override
    public void onError(Throwable e) {
        // 请求失败时调用
    }

    @Override
    public void onComplete() {
        // 请求完成时调用
    }
});

//方式一:
Observable.zip(Observable.fromIterable(requestObservables), new Function<Object[], Object>() {
    @Override
    public Object apply(Object[] objects) throws Exception {
        // 对多个请求的结果进行处理
        return null;
    }
}).subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Observer<Object>() {
...

    @Override
    public void onNext(Object o) {
        // 对多个请求的结果进行统一处理
    }
...

});


kotlin协程版本

GlobalScope.launch(Dispatchers.Main) {
    try {
        val userDeferred = async { apiService.getUser("username") }
        val reposDeferred = async { apiService.listRepos("username") }
        val result = awaitAll(userDeferred, reposDeferred)

        val user = result[0] as User
        val repos = result[1] as List<Repo>

        // 在这里对两个异步任务的结果进行合并和处理
    } catch (e: Exception) {
        // 处理异常
    }
}