我已经开始学习RxAndroid,下面是我编写的代码,用于迭代包含从服务器获取的数据的模型对象(Results)。我在observable中迭代模型对象并在观察者中提供新创建的对象。我尝试订阅观察者以取消订阅片段的 Orientation changes 上的任务。但是subscribe()
会返回 VOID 而不是订阅对象。
问题:
如果在任务完成之前发生配置更改,我可以想到的重启此任务的唯一方法是,我在onSavedInstance()中保留服务器响应,并在重新创建片段时从bundle中检索它。它需要布尔值来确定配置更改是否发生在配置更改之前。 是否有一种优雅而清洁的方式来应对这种情况?
private void createComicList(final List<Result> marvelResults) {
final MarvelComics marvelComics = new MarvelComics();
Observable marvelObservable2 = Observable.create(new ObservableOnSubscribe<MarvelComic>() {
@Override
public void subscribe(ObservableEmitter<MarvelComic> e) throws Exception {
for(Result result : marvelResults) {
MarvelComic marvelComic = new MarvelComic();
marvelComic.setDescription(result.getDescription());
marvelComic.setTitle(result.getTitle());
marvelComic.setPageCount(result.getPageCount());
marvelComic.setThumbnailUrl(result.getThumbnail().getPath());
marvelComic.setId(result.getId());
e.onNext(marvelComic);
}
e.onComplete();
}
});
marvelObservable2.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MarvelComic>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(MarvelComic comic) {
marvelComics.getMarvelComicList().add(comic);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
showToast();
}
});
}
答案 0 :(得分:0)
Observable.subscribe(Observer<? super T>)
方法会在2.x中返回void
,因为Observer.onSubscribe(Disposable)
可以获得1.x中曾经是Subscription
的取消支持。
final CompositeDisposable composite = new CompositeDisposable();
Observable<Integer> source = Observable.just(1)
source.subscribe(new Observer<Integer>() {
@Override public void onSubscribe(Disposable d) {
composite.add(d); // <---------------------------------------------
}
@Override public void onNext(Integer t) {
System.out.println(t);
}
@Override public void onError(Throwable e) {
e.printStackTrace();
}
@Override public void onComplete() {
System.out.println("Done");
}
});
composite.add(source
.subscribeWith( // <-----------------------------------------------
new DisposableObserver<Integer>() {
@Override public void onNext(Integer t) {
System.out.println(t);
}
@Override public void onError(Throwable e) {
e.printStackTrace();
}
@Override public void onComplete() {
System.out.println("Done");
}
});
答案 1 :(得分:-2)
Observable的subscribe()方法在早期版本的RxJava中返回Subscription对象,当前版本返回Disposble类的对象,您可以通过调用dispose()方法取消订阅。
对于第二个问题,您可以查看此答案Best practice: AsyncTask during orientation change