RxAndroid没有为观察者返回Subcription

时间:2017-04-11 10:22:15

标签: android rx-java rx-android

我已经开始学习RxAndroid,下面是我编写的代码,用于迭代包含从服务器获取的数据的模型对象(Results)。我在observable中迭代模型对象并在观察者中提供新创建的对象。我尝试订阅观察者以取消订阅片段的 Orientation changes 上的任务。但是subscribe()会返回 VOID 而不是订阅对象。

问题

  • 最新版本的RxAndroid在配置/方向更改时是否处理取消订阅?
  • 如果在任务完成之前发生配置更改,我可以想到的重启此任务的唯一方法是,我在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();
                    }
                });
    }
    

2 个答案:

答案 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