如何决定RxJava?

时间:2016-05-11 15:40:39

标签: android rx-java retrofit2 rx-android

我是RxJava的新手,但想在我的android项目中使用Retrofit 2进行尝试。应用程序支持auth,所有对服务器的请求都必须在标头中包含令牌,如果令牌无效,我必须发送auth请求。

这是我的Api界面



public interface ApiRx {

    @FormUrlEncoded
    @POST("auth")
    Observable<AuthResponse> makeAuth(@FieldMap Map<String, String> fields);

    @GET("update")
    Observable<UpdateResponse> getUpdates(@Query("date") String date);
}
&#13;
&#13;
&#13;

但我现在不知道如何使用Rx组织if-else语句,如果更新请求因auth原因失败,请发送auth请求然后重试更新请求。

也许有人有simillar案例,如果你举例说明如何实现这个案例会很好。

1 个答案:

答案 0 :(得分:2)

您最好将退货类型更改为Observable<Response<>>,这样会:

public interface ApiRx {

    @FormUrlEncoded
    @POST("auth")
    Observable<Response<AuthResponse>> makeAuth(@FieldMap Map<String, String> fields);

    @GET("update")
    Observable<Response<UpdateResponse>> getUpdates(@Query("date") String date);
}

这样您就可以访问服务器响应以及数据。完成此操作后,您可以执行以下请求:

api.getUpdates(date)
    .flatMap(new Func1<Response<UpdateResponse>, Observable<UpdateResponse>>() {
        @Override
        public Observable<UpdateResponse> call(Response<UpdateResponse> response) {

            if (!response.isSuccess() && response.code() == 403) {
                // return makeAuth(fields)
                // .flatMap(save auth)
                // .flatMap(return getUpdates)
                // .flatMap(return Observable.just(response.body())
            }
            else {
                return Observable.just(response.body());
            }

        }
    })
    .subscribe();

我在if auth失败的部分中不得不有点模糊,因为我不知道你的系统是如何设置的,但它应该给你正确的想法。