Retrofit处理多个调用,响应值存储为重用

时间:2018-01-23 22:24:13

标签: android retrofit2

我在这里提出了一个关于Android和Retrofit的新问题。我想知道在Android Activity上处理多个异步调用的正确方法是什么,并且每一个onResponse返回下一个调用所使用的值,因为如果我理解正常,则调用在后台运行,这意味着如果调用没有完成你的返回值将为空,直到你得到一个成功的回复。

我正在考虑用这样的东西来实现这个目标(只有基础):

private List<SomeModel> mylist;
final Call<List<SomeModel>> call1 = client.getSomeValues1();
final Call<List<SomeModel2>> call2 = client.getSomeValues2();

call1.enqueue(new Callback<SomeModel>() {
                    @Override
                    public void onResponse(SomeModel> call, Response<SomeModel> response) {
                        if (response.isSuccessful()) {
                            // Set mylist to response.body()
                            mylist = response.body();
                        } 
                    }

                    @Override
                    public void onFailure(Call<SomeModel> call, Throwable t) {
                        mylist = null;
                    }
                });


call2.enqueue(new Callback<SomeModel2>() {
                    @Override
                    public void onResponse(SomeModel2> call, Response<SomeModel2> response) {
                        if (response.isSuccessful()) {
                            // Do something with my list and also with call2 response

                            if(mylist != null) {
                                for (SomeModel singleObject: mylist) {
                                    // Do something with each object
                                }
                            }

                        } 
                    }

                    @Override
                    public void onFailure(Call<SomeModel2> call, Throwable t) {
                        // Do something with fail call
                    }
                });

之前的例子之类是因为调用在后台运行而且call2可能先完成,然后mylist值将为null,因为call1还没有完成。

此外我还在考虑将call2放在call1 onResponse中,但我感觉不对。我不得不说我还在学习,我是个新秀。

那么,处理这个问题的原因是什么以及如何处理?谢谢。我希望我的问题是可以理解的。

1 个答案:

答案 0 :(得分:0)

感谢您的建议@insa_c 我用RXJava2实现了这一点,这就是我用它解释的一般方式:

首先,您需要将api服务定义为Observables

@GET("url-1/")
Observable<List<Model1>> service1();

@GET("url-2/")
Observable<List<Model2>> service2();

现在,您的活动会以这种方式拨打电话:

final Observable<List<Model1>> call1 = APIClient.getClient().create(APIService.class).service1();

final Observable<List<Model2>> call2 = APIClient.getClient().create(APIService.class).service2();

现在让我们用zip制作一个独特的observable(我使用了List,因为我在列表中添加了两种不同类型的对象,当两个调用完成时我将获得这些对象):

<Observable<List<Object>> test = Observable.zip(call1, call2, new BiFunction<List<Model1>, List<Model2>, List<Object>>() {
    @Override
    public List<Object> apply(List<Model1> objects1, List<Model2> objects2) throws Exception {
        List<Object> list = new ArrayList<>();
        list.addAll(objects1);
        list.addAll(objects2);
        return list;
    }
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());

现在唯一要做的就是订阅并决定你想对这两个回复的内容做些什么:

test.subscribe(new Observer<List<?>>() {

    @Override
    public void onSubscribe(Disposable d) {
        Log.d("TAG", "onSubscribe");
    }

    @Override
    public void onNext(List<?> objects) {
        // You can split the list by object in here with an instanceof to determine if it's Model1 or Model2
    }

    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
    }

    @Override
    public void onComplete() {
        // Do something here, both calls finished, if you stored something in onNext method you can use it here.
    }

});

我希望这些信息对某人有用。