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)中调用每个可观察对象。
如果我有 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)中调用每个可观察对象。