
ObjectBox入门-9-订阅观察
HumphreyDanobjectbox
Data Observers, Reactive Extensions
订阅观察模式,Rx 支持
1  | Query<Task> query = taskBox.query().equal(Task_.complete,false).build();  | 
Data Observers
当数据改变时,ObjectBox 会通知所有的订阅者.他们可以订阅确定的数据类型(通过 BoxStore)或查询结果集。实现 io.objectbox.reactive.DataObserver 即可创建观察者
1  | interface DataObserver<T> {  | 
订阅普通改变
1  | DataObserver<Class<Task>> taskObserver = new DataObserver<Class<Task>>() {  | 
订阅查询
1  | Query<Task> query = taskBox.query().equal(Task_.completed, false).build();  | 
取消订阅
当调用 observer() 时,返回 io.objectbox.reactive.DataSubscription
1  | interface DataSubscription {  | 
1  | DataSubscription subscription = boxStore.subscribe().observer(myObserver);  | 
通常情况下建议使用 DataSubscriptionList
1  | private DataSubscriptionList subscriptions = new DataSubscriptionList();  | 
订阅,事务
当事务提交时发出订阅通知。单独调用box.put(),remove() ,默认的事务会开启提交。例如如下将触发两次 User.class 通知;
1  | box.put(firendUser);  | 
使用 runInTx(),callInTx() 可以将多个操作在同一个十五中提交.如上可以修改为:
1  | box.put(friendUser,myUser);  | 
响应式扩展
线程切换
1  | Query<Task> query = taskBox.query().equal(Task_.complete, false).build();  | 
当然可以使用自定义 Looper 创建 AndroidScheduler,或者实现 io.objectbox.reactive.Scheduler
- 查询在后台线程执行
 - DataTransformer 运行在后台线程
 - DataObserver 和 ErrorObserver 运行在后台线程,除非通过 on() 指定
 
数据转换
如何订阅实际的对象数量:
1  | boxStore.subscribe()  | 
异常订阅
transformer 可能抛出各种异常,DataObserver 可能抛出 RuntimeException.
1  | public interface ErrorObserver {  | 
在 subscribe() 后调用 onError() 即可.
一次通知 vs. 改变即通知
当订阅 query 后,DataObserver 具有如下行为:
- 初始化查询结果(就在订阅后)
 - 更新查询结果(在数据改变后)
 
有时候仅对其中一种行为感兴趣.single() 和 onlyChange() 应运而生(在 subscribe() 后调用)
single() 只响应一次通知即自动取消。
弱引用
一般情况下,为了避免内存泄露,通常尽可能在不需要的时候取消订阅。当然,你不在乎的话,在 subscribe() 后调用 weak() 也可以.
ObjectBox RxJava 扩展库
1  | implementation "io.objectbox:objectbox-rxjava:$objectboxVersion"  | 
 评论
匿名评论隐私政策

