在层中连接RxJava Observable

时间:2016-09-29 01:26:15

标签: android rx-java rx-android

我的应用中有3层。 Layer1从layer2订阅Observable。 Layer2订阅了layer3,以便将返回的数据发送到layer1。

层1

layer2.getData(data).subscribe(newData -> {Log.d("onNext", "returned");},
                    throwable -> {Log.d("onError", throwable.getMessage());});

假设layer3有一个名为downloadDataFromApi(data);

的方法
public Observable<Data> getData(String data) {
    return  Observable.create(new Observable.OnSubscribe<Data>() {
        @Override
        public void call(Subscriber<? super Data> subscriber) {
            Data data = new Data();
            subscriber.onNext(data);
            subscriber.onCompleted();
            // Can't find a way to connect to layer3.
        }
    });
}

在layer2的getData()方法中我需要做什么?在将Observable返回到layer1之前,我基本上想要逻辑。

这有意义吗?

2 个答案:

答案 0 :(得分:2)

直接返回Observable。然后,layer1照常处理订阅。

class Layer2 {
    public Observable<Data> getData(String data) {
        return layer3.getData(data);
    }
}

答案 1 :(得分:1)

从我看到你有3层(演示文稿,业务逻辑,数据访问)。

所以你可以做的是:

class PresentationLayer {

    private BusinessLogicLayer layer;

    PresentationLayer() {
        layer = new BusinessLogicLayer();
    }

    public void showName() {
        layer.getNameWithoutRxPrefix()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String name) throws Exception {
                        // show name somewhere
                        Log.d("PresentationLayer", "name: " +  name);
                    }
                });
    }
}

class BusinessLogicLayer {

    private DataAccessLayer layer;

    BusinessLogicLayer() {
        layer = new DataAccessLayer();
    }

    public Observable<String> getNameWithoutRxPrefix() {
        return layer.getName()
                .map(new Function<String, String>() {
                    @Override
                    public String apply(String name) throws Exception {
                        return name.replace("Rx", "");
                    }
                });
    }
}

class DataAccessLayer {

    public Observable<String> getName() {
        return Observable.just("RxAndroid");
    }
}

如您所见,我在我的数据访问层(getName)中返回一个Observable,并在我的业务逻辑方法(map)中将另一个方法链接到它,然后将其返回到表示层