RxAndroid 链动作
RxAndroid chain actions
我正在使用 RxAndroid + Retrofit,我想做的是将 2 个动作合二为一。例如我有两种方法。 onNext 块中的第一个 return 一些 URL。
apiRequests.getApi().getURL()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<CreateUserResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(CreateUserResponse createUserResponse) {
secondMethos(createUserResponse.getURL()); // HERE GOES THE URL
}
});
第二种方法使用此 URL 做其他事情
public void secondMethod(URL){
Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
}
});
Observable.create(new Observable.OnSubscribe<List<Arg>>() {
@Override
public void call(Subscriber<? super List<Arg>> subscriber) {
subscriber.onNext(test(URL));
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Arg>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<Arg> params) {
}
});
}
是否可以将这些方法合二为一?谢谢
您可以简单地映射这些值
apiRequests.getApi().getURL()
.map(new Func1<CreateUserResponse, List<Arg>>() {
public List<Arg> call(CreateUserResponse response) {
return test(response.getURL());
}
})
.subscribeOn(Schedulers.newThread())
.observerOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Arg>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<Arg> params) {
}
请注意,如果您希望每个 Arg
而不是 List<Arg>
调用 onNext,您可以使用 flatMapInterable,如下所示。
apiRequests.getApi().getURL()
.flatMapIterable(new Func1<CreateUserResponse, List<Arg>>() {
public List<Arg> call(CreateUserResponse response) {
return test(response.getURL());
}
})
.subscribeOn(Schedulers.newThread())
.observerOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Arg>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Arg params) {
}
});
我正在使用 RxAndroid + Retrofit,我想做的是将 2 个动作合二为一。例如我有两种方法。 onNext 块中的第一个 return 一些 URL。
apiRequests.getApi().getURL()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<CreateUserResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(CreateUserResponse createUserResponse) {
secondMethos(createUserResponse.getURL()); // HERE GOES THE URL
}
});
第二种方法使用此 URL 做其他事情
public void secondMethod(URL){
Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
}
});
Observable.create(new Observable.OnSubscribe<List<Arg>>() {
@Override
public void call(Subscriber<? super List<Arg>> subscriber) {
subscriber.onNext(test(URL));
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Arg>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<Arg> params) {
}
});
}
是否可以将这些方法合二为一?谢谢
您可以简单地映射这些值
apiRequests.getApi().getURL()
.map(new Func1<CreateUserResponse, List<Arg>>() {
public List<Arg> call(CreateUserResponse response) {
return test(response.getURL());
}
})
.subscribeOn(Schedulers.newThread())
.observerOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Arg>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<Arg> params) {
}
请注意,如果您希望每个 Arg
而不是 List<Arg>
调用 onNext,您可以使用 flatMapInterable,如下所示。
apiRequests.getApi().getURL()
.flatMapIterable(new Func1<CreateUserResponse, List<Arg>>() {
public List<Arg> call(CreateUserResponse response) {
return test(response.getURL());
}
})
.subscribeOn(Schedulers.newThread())
.observerOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Arg>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Arg params) {
}
});