api 具有改造和 reactx 可观察性的服务

api service with retrofit and reactivex observable

如果我有 4 个 api 使用改造的服务请求,并且我在我的 activity 中调用所有这些请求,则执行第 2 个等待第一个完成或第 2 个或第 3 个请求而不等待其他完成, 这里是我的api 服务列表:

@FormUrlEncoded
@POST("goes/for/api1")
Observable<ResponseBody> req1(
        @HeaderMap Map<String, String> headers,
        @FieldMap Map<String, String> fields);

@FormUrlEncoded
@POST("goes/for/api2")
Observable<ResponseBody> req2(
        @HeaderMap Map<String, String> headers,
        @FieldMap Map<String, String> fields);

@FormUrlEncoded
@POST("goes/for/api3")
Observable<ResponseBody> req3(
        @HeaderMap Map<String, String> headers,
        @FieldMap Map<String, String> fields);

@FormUrlEncoded
@POST("goes/for/api4")
Observable<ResponseBody> req4(
        @HeaderMap Map<String, String> headers,
        @FieldMap Map<String, String> fields);

对主持人的要求:

public void request1(){
   Map<String, String> headers = new HashMap<>();
   headers.put("Accept", "application/json");
   Map<String, String> fields = new HashMap<>();
   fields.put("key", "value");
   Observable<ResponseBody> response = mApiService.req1(headers, fields);
   subscribe(response, this);
}
public void request2(){
   Map<String, String> headers = new HashMap<>();
   headers.put("Accept", "application/json");
   Map<String, String> fields = new HashMap<>();
   fields.put("key", "value");
   Observable<ResponseBody> response = mApiService.req2(headers, fields);
   subscribe(response, this);
}
public void request3(){
   Map<String, String> headers = new HashMap<>();
   headers.put("Accept", "application/json");
   Map<String, String> fields = new HashMap<>();
   fields.put("key", "value");
   Observable<ResponseBody> response = mApiService.req3(headers, fields);
   subscribe(response, this);
}
public void request4(){
   Map<String, String> headers = new HashMap<>();
   headers.put("Accept", "application/json");
   Map<String, String> fields = new HashMap<>();
   fields.put("key", "value");
   Observable<ResponseBody> response = mApiService.req4(headers, fields);
   subscribe(response, this);
}

我的演示者负责处理并回复 activity

@Override
public void onNext(ResponseBody responseBody) {
    try {
        getView().onDeliverResponse(responseBody.string());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

每次调用我都会发出状态请求 String state = "state1"

@Override
public void onDeliverResponse(String response) {
    handleResponse(response);
}

void handleResponse(String response) {
   if(state = "state1"){
     //
   }
   else {
     //
   }
}

我的状态字符串将覆盖我的最后一个请求 "state4",所以当第三个请求完成时状态变为 "state4"?因为每个请求都会更新我的 ui

问题是当您分别调用这些 API 请求时,您永远不知道 OnNext 方法调用的顺序,因为它取决于服务器响应时间。 例如。您可以按顺序调用这些请求

req1

req2

req3

req4

但是得到这样的状态

resp2

resp4

resp1

resp3

因此,您的最终状态将是 state3。如果你想按顺序得到响应,你应该使用 RxJava 运算符,例如 flatMap 或其他:

apiService.A()
.doOnNext(modelA -> getView().updateState("state1"))
.flatMap(modelA -> apiService.B())
.doOnNext(modelb -> getView().updateState("state2"));

示例: https://medium.com/@adinugroho/chaining-multiple-retrofit-call-using-rxjava-177b64c8103e

或者在上一个可观察订阅的onNext(或onCompleted)中调用每个可观察对象。