首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rx:创建一个可观察到的可配置

Rx:创建一个可观察到的可配置
EN

Stack Overflow用户
提问于 2016-10-03 16:24:12
回答 2查看 191关注 0票数 3

我是RxJava新手,我想知道如何创建一个可配置的可观察的?让我们想象一下,我可以像这样编写一个DB到DB的传输:

代码语言:javascript
运行
复制
srcDb.getObservable(Bean.class)
     .sql(selectSql)
     .params(selectParams)
     .subscribe(
          trgDb.getSubscriber(Bean.class)
               .sql(insertSql)
     );

我已经可以在订阅服务器上做到这一点,但是如何才能以相同的方式对可观察到的用户进行一些小配置呢?

EN

Stack Overflow用户

回答已采纳

发布于 2016-10-04 16:42:17

也许我找到了一个可以接受的方法来解决这个问题。在这里,我需要做的似乎是在可观测实例化本身之外的双重绑定。例如,我需要一个DbObservable和DbOnSubscribe对,它们相互依赖,如下所示:

DbObservable类:

代码语言:javascript
运行
复制
public class DbObservable<T> extends Observable<T> {

    //Some parameter
    private String sql;

    protected DbObservable(DbOnSubscribe<T> onSub) {
        super(onSub);
    }

    //Getter for DbOnSubscribe
    public String getSql() {
        return sql;
    }

    //Chain parameter modifier
    public DbObservable<T> sql(String sql) {
        this.sql = sql;
        return this;
    }
}

DbOnSubscribe类:

代码语言:javascript
运行
复制
public class DbOnSubscribe<T> implements Observable.OnSubscribe<T> {

    private DbObservable<T> dbObservable;

    @Override
    public void call(Subscriber<? super T> subscriber) {
        String sql = dbObservable.getSql(); //Access SQL param
        subscriber.onNext( (T) sql ); //Use subscriber
        subscriber.onCompleted();
    }

    //Set back-reference
    public void setDbObservable(DbObservable<T> dbObservable) {
        this.dbObservable = dbObservable;
    }
}

最后,假设我们的DbConnector类:

代码语言:javascript
运行
复制
public class DbConnector {

    public DbObservable<String> getObservable() {
        DbOnSubscribe<String> onSub = new DbOnSubscribe<String>();
        DbObservable<String> obs = new DbObservable<>(onSub);
        onSub.setDbObservable(obs);
        return obs;
    }
}

所以当我尝试的时候..。

代码语言:javascript
运行
复制
public class DbObservableTest {

    public static void main(String[] args) {
        DbConnector srcDb = new DbConnector();

        srcDb.getObservable()
                .sql("some SQL")
                .subscribe(System.out::println);
    }
}

..。真的很管用!它打印出“一些SQL”。

结论

  1. 如果您想变得超级干净,并且不介意增加一两行代码,请按照Joel和Tassos Bassoukos的建议选择一个构建器。
  2. 如果您不害怕更复杂的代码(应该总是封装在某个地方),并且真的希望这些参数在您自己的可观察范围内,您可以尝试双绑定的方法。
  3. 还有其他选择吗?
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39836149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档