我是RxJava新手,我想知道如何创建一个可配置的可观察的?让我们想象一下,我可以像这样编写一个DB到DB的传输:
srcDb.getObservable(Bean.class)
.sql(selectSql)
.params(selectParams)
.subscribe(
trgDb.getSubscriber(Bean.class)
.sql(insertSql)
);我已经可以在订阅服务器上做到这一点,但是如何才能以相同的方式对可观察到的用户进行一些小配置呢?
发布于 2016-10-04 16:42:17
也许我找到了一个可以接受的方法来解决这个问题。在这里,我需要做的似乎是在可观测实例化本身之外的双重绑定。例如,我需要一个DbObservable和DbOnSubscribe对,它们相互依赖,如下所示:
DbObservable类:
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类:
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类:
public class DbConnector {
public DbObservable<String> getObservable() {
DbOnSubscribe<String> onSub = new DbOnSubscribe<String>();
DbObservable<String> obs = new DbObservable<>(onSub);
onSub.setDbObservable(obs);
return obs;
}
}所以当我尝试的时候..。
public class DbObservableTest {
public static void main(String[] args) {
DbConnector srcDb = new DbConnector();
srcDb.getObservable()
.sql("some SQL")
.subscribe(System.out::println);
}
}..。真的很管用!它打印出“一些SQL”。
结论
发布于 2016-10-03 23:29:21
有两种方法可以做到:
选项1:让您自己的对象执行配置,然后有一个execute()、query()或toObservable()来切换域:
srcDb
.find(Bean.class)
.sql(selectSql)
.params(selectParams)
.execute()
.subscribe(
trgDb.getSubscriber(Bean.class)
.sql(insertSql)
);选项2:使用.compose()重用常见操作:
srcDb
.getObservable(Bean.class)
.compose(addSQLParameters())
.subscribe(
trgDb.getSubscriber(Bean.class)
.sql(insertSql)
);
<T> Transformer<T,T> addSQLParameters() {
return obs -> obs.sql(selectSql).params(selectParams);
}我建议您使用选项1,因为它允许更好地管理代码的一部分。
https://stackoverflow.com/questions/39836149
复制相似问题