[英]How chain Retrofit calls?
如何才能一次又一次地进行一次改装?
我正在阅读有关RxJava的内容,而且我已经使用RxJava进行了调用,但是我没有找到如何使用flatMaps的好例子。
有人可以解释一下如何对我这么做吗?
我正在尝试进行这两个调用,在完成这两个调用之后,我想开始一个新的活动。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://api.openweathermap.org/data/2.5/")
.build();
WeatherService weatherService = retrofit.create(WeatherService.class);
final Observable<Weather> london = weatherService.getCurrent();
london.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Weather>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Weather weather) {
Log.i("WEATHER","Weather Name: " + weather.getName());
}
});
final Observable<Wind> windObservable = weatherService.getWind();
windObservable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Wind>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Wind wind) {
Log.i("WEATHER","Wind: " + wind.getSpeed().toString());
}
});
}
}
也许这个链接: https : //github.com/ReactiveX/RxJava/wiki/Combining-observables会有所帮助。 结帐拉链。 最终,switchMap方法在您的情况下可能很有用。
编辑:也许这个例子http://joluet.github.io/blog/2014/07/07/rxjava-retrofit/将帮助你更多。
编辑#2:一些代码
login().switchMap(new Func1<FirstResponse, Observable<SecondResponse>>() {
@Override
public Observable<SecondResponse> call(FirstResponse t) {
if (ApiUtils.isLoginValid(t)) {
return profile(t.getToken());
}
else{
return Observable.error(new CustomException());
}
}
}
}).subscribe(subscriber());
注意:profile方法的返回类型是Observable<SecondResponse>
,订阅者方法类型是Subscriber<? super SecondResponse>
Subscriber<? super SecondResponse>
您可以使用示例中的flatMap
或concatWith
:
static Observable<Integer> intObservable() {
return Observable.just(1).delay(1, TimeUnit.SECONDS);
}
static Observable<String> stringObservable() {
return Observable.interval(1, TimeUnit.SECONDS).take(2).map(v -> v.toString());
}
public static void main(String[] args) {
intObservable()
.doOnNext(System.out::println)
.ignoreElements()
.cast(Object.class)
.concatWith(stringObservable()
.doOnNext(System.out::println)
.ignoreElements())
.toBlocking()
.subscribe();
}
但是,如果两个源具有不同类型,则需要一些强制转换。
你有多种选择。 其中一个是使用zip
:
london.zipWith(weatherService, new Func2<Weather, Wind, Something>() {
@Override
public Something call(final Weather weather, final Wind wind) {
...
return something;
}
}).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Something>() {
@Override
public void onCompleted() {
}
@Override
public void onError(final Throwable e) {
}
@Override
public void onNext(final Something something) {
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.