不调用Observable.map()

时间:2017-01-26 03:18:15

标签: android rx-java rx-android

我在RxJava和RxAndroid中使用,我昨天才开始研究它们。我使用REST api从服务器获取数据。我使用两个主要的Rx运算符,一个是.map(),另一个是.zip()

以下代码是我的Observable

之一
protected static Observable<List<Subdistrict>> subdistrictObservable = Observable.defer(new Func0<Observable<String>>() {
    @Override
    public Observable<String> call() {
        try {
            return Observable.just(new MasterService.MasterSubdistrict().get());
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        } catch (ExecutionException ee) {
            ee.printStackTrace();
        }

        return null;
    }
})
        .filter(new Func1<String, Boolean>() {
            @Override
            public Boolean call(String s) {
                return s != null;
            }
        })
        .map(new Func1<String, List<Subdistrict>>() {
            @Override
            public List<Subdistrict> call(String s) {
                ObjectMapper mapper = new ObjectMapper();
                List<Subdistrict> subdistricts = null;

                try {
                    JsonNode node = mapper.readTree(s);
                    node = node.get("json");

                    TypeReference<List<Subdistrict>> typeRef = new TypeReference<List<Subdistrict>>() {
                    };
                    subdistricts = mapper.readValue(node.toString(), typeRef);
                } catch (IOException ie) {
                    ie.printStackTrace();
                }

                return subdistricts;
            }
        })
        .subscribeOn(Schedulers.io());

将多个Observable压缩在一起

Observable<List<Region>> observableChain = Observable.zip(
        Subdistrict.subdistrictObservable,
        District.districtObservable,
        Province.provinceObservable,
        Region.regionObservable,
        new Func4<List<Subdistrict>, List<District>, List<Province>, List<Region>, List<Region>>() {
            @Override
            public List<Region> call(List<Subdistrict> subdistricts, List<District> districts, List<Province> provinces, List<Region> regions) {
                List<Region> zipRegions = new LinkedList<Region>();
                // Do my stuff

                return zipRegions;

            }
        });
observableChain
        .subscribeOn(Schedulers.io())
        .subscribe(regionOnNext);

问题是.map()中的Observable未被调用。我不知道为什么。

1 个答案:

答案 0 :(得分:0)

我遵循@ytRino使用fromEmitter建议的内容并且它有效。但是,我不确定它是否正确。因此,如果有人在下面的代码中发现了错误,请告诉我。

以下代码是Observable的作品版本。我添加了一个名为MasterService.Callback的抽象类,所以当Asynctask完成执行时,结果将返回Observable

protected static Observable<List<Subdistrict>> subdistrictObservable = Observable.fromEmitter(new Action1<AsyncEmitter<List<Subdistrict>>>() {
    @Override
    public void call(final AsyncEmitter<List<Subdistrict>> listAsyncEmitter) {
        try {

            new MasterService.MasterSubdistrict(new MasterService.Callback() {
                @Override
                public void onSuccess(String s) {
                    List<Subdistrict> subdistricts = null;
                    // Do something
                    listAsyncEmitter.onNext(subdistricts);
                    listAsyncEmitter.onCompleted();
                }

                @Override
                public void onNull() {
                    listAsyncEmitter.onCompleted();
                }

                @Override
                public void onError(Throwable t) {
                    listAsyncEmitter.onError(t);
                }
            }).execute();
        } catch (Exception e) {
            listAsyncEmitter.onError(e);
        }
    }
}, AsyncEmitter.BackpressureMode.BUFFER)
        .observeOn(AndroidSchedulers.mainThread());