【问题标题】:Retrofit 2 sequential Requests using asynchronous network calls with retry使用带重试的异步网络调用改造 2 个顺序请求
【发布时间】:2016-12-14 01:25:01
【问题描述】:

我正在尝试使用改造向 api 发送网络请求,当我得到响应时,在另一个调用中使用该响应的一部分,我按照建议使用了调用和 rxjava,但我总是执行第二个请求在第一个之前

public interface ChannelRequest {

    @POST("authenticate_with_options")
    @FormUrlEncoded
    Observable<Channel> getAuthenticationChannel(@FieldMap Map<String, String> params);


    @POST("check")
    @FormUrlEncoded
    Observable<Channel> getAuthenticationStatus(@FieldMap Map<String, String> params);
}

ss

        Observable<Channel> call2 = mAPI.gettheChannel().getAuthenticationStatus(Constants.HTTP.PARAMSAUTH);
        Observable.interval(3, TimeUnit.SECONDS).retry(3);
        Subscription subscription2 = call2
                .subscribeOn(Schedulers.io()) // optional if you do not wish to override the default behavior
                .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Channel>() {


                    @Override
                    public void onCompleted() {


                    }

                    @Override
                    public void onError(Throwable e) {

                        if (e instanceof HttpException) {
                            HttpException response = (HttpException) e;
                            int code = response.code();
                        }
                    }

                    @Override
                    public void onNext(Channel channel) {

                        Log.d("AuthStatus", "onResponse: " + Channel.getChannel());

                    }
                });

我不确定我是否必须再使用 RxJava,实现这一目标的最佳实践是什么?

谢谢

【问题讨论】:

    标签: android rx-java retrofit2 rx-android okhttp3


    【解决方案1】:

    您的代码看起来不像您的问题(因为在您的示例中只有一次调用您的 api)

    不过,您可以查看运算符 flatMap 来调用另一个 observable,并使用上一次调用的结果。

     mAPI.gettheChannel().getAuthenticationStatus(Constants.HTTP.PARAMSAUTH)
                         // use the result from a previous call to perform another one
                         .flatMap(result -> mApi.gettheChannel().getAuthentificationChannel(result))
                         .subscribeOn(Schedulers.io()) // optional if you do not wish to override the default behavior
                         .observeOn(AndroidSchedulers.mainThread())
                         .subscribe();
    

    【讨论】:

    • 我在下面做了这个,可以吗? .flatMap(new Func1&lt;AccepttoChannel, Observable&lt;AccepttoChannel&gt;&gt;() { @Override public Observable&lt;AccepttoChannel&gt; call(AccepttoChannel accepttoChannel) { //String token = ... // TODO extract token. Constants.HTTP.PARAMSAUTH.put("channel",accepttoChannel.getChannel()); return mAPI.getAccepttoChannel().getAuthenticationChannel(Constants.HTTP.PARAMSAUTH); } })
    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    相关资源
    最近更新 更多