0
在我的活动中,我发出了一个HTTP请求Retrofit2
。成功后,我收到一系列元素。在每一个元素上,我都会发出第二个请求,并在成功时再次响应一系列元素。我需要一个事件触发所有嵌套的请求完成。我怎样才能实现这一点,而不计算每个嵌套请求的成功,并将其与第一个数组的大小进行比较?这里是我的Activity
:在Android中使用Retrofit2和RxJava2实现嵌套的HTTP请求
public class ABCActivity extends AppCompatActivity {
private static final String TAG = "StackoverflowActivity";
private Disposable mDmRequestSubscription;
private StopRequestApiInteractor mStopRequestInteractor;
private DmRequestApi mDmRequestApiInteractor;
private Position mPosition;
private List<ItdOdvAssignedStop> mStopsList = new ArrayList<>();
private List<List<ItdDeparture>> mAllDepartures;
private List<Place> mStopsInRange = new ArrayList<>();
private List<Place> stopsInRange;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestStops();
}
public void requestStops() {
mStopRequestInteractor
.getStopFinderRespond(mPosition)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(s -> Observable.just(s.getStopFinder().getItdOdvAssignedStops()))
.subscribe(this::onSuccess, this::onError);
}
private void onError(Throwable throwable) {
throwable.printStackTrace();
}
private void onSuccess(ItdOdvAssignedStop[] response) {
mStopsList.clear();
mStopsList.addAll(Arrays.asList(response));
for (ItdOdvAssignedStop stop : mStopsList) {
mDmRequestSubscription = mDmRequestApiInteractor
.getStopDmRespond(stop.getStopID())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onDmRequestSuccess, this::onDmRequestError);
}
}
private void onDmRequestError(Throwable throwable) {
Log.e(TAG, "DM Request failed");
}
private void onDmRequestSuccess(ResponseBody entry) {
Log.d(TAG, "DM Request success");
mStopsInRange = getStopsInRange();
update();
}
public List<Place> getStopsInRange() {
//Some things done here...
return stopsInRange;
}
private void update() {
//Shall be called only once as soon as all onDmRequestSuccess() were fired
}
}
我的活动不能在我的项目之外运行。我只想要一个干净的解决方案只要响应所有请求就触发update()
一次。并不是每次嵌套请求都被响应。
我该如何执行使用onNext()
,onCompleted()
和onError()
方法Subscriber
?那么如何将我的代码转换成如下所示的代码?
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Test");
subscriber.onError(null);
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError");
}
@Override
public void onNext(String s) {
System.out.println("onNext");
}
});
感谢,伟大的答案。你的代码是否考虑到在第一个'onSucess()'方法中有'for'循环? – unlimited101
由第一个flatMap处理,它将获取结果列表并作为单独的项目遍历它。第二个flatMap将该项目映射到第二个请求 – koperko