rxjava和android.database.contentobserver
应用程序使用RxJava进行网络调用,然后使用数据库中的数据修改结果并显示它们。应用程序使用android.database.ContentObserver侦听数据库更改,并在发生更改时修改数据。目前,它与下面的代码一起工作,但有没有更好的方法来实现同样的效果? 谢谢rxjava和android.database.contentobserver,android,rx-java,rx-android,Android,Rx Java,Rx Android,应用程序使用RxJava进行网络调用,然后使用数据库中的数据修改结果并显示它们。应用程序使用android.database.ContentObserver侦听数据库更改,并在发生更改时修改数据。目前,它与下面的代码一起工作,但有没有更好的方法来实现同样的效果? 谢谢 Observable-Observable=Observable.create(new Observable.OnSubscribe()){ @凌驾 public void call(Subscriberbox建议调查SqlBri
Observable-Observable=Observable.create(new Observable.OnSubscribe()){
@凌驾
public void call(Subscriberbox建议调查SqlBrite可能是最好的做法,但是如果您没有时间学习新的API,我发现这里有一个很酷的技术
如果将每个数据库查询结果包装为行为主题,则可以使用其URI作为键将其缓存在hashmap中。然后,当覆盖Content Observer的onChange方法时,可以轻松地将刷新的对象推送到下游:
final protected MaxSizeHashMap<Uri, Subject<T, T>> subjectMap = new MaxSizeHashMap<>(cacheSize / 300);
final private ContentObserver contentObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
if (subjectMap.containsKey(uri)) {
subjectMap.get(uri).onNext(query(uri));
}
}
};
final protected MaxSizeHashMap subjectMap=new MaxSizeHashMap(cacheSize/300);
final private ContentObserver ContentObserver=new ContentObserver(new Handler()){
@凌驾
public void onChange(布尔自更改,Uri){
super.onChange(selfChange,uri);
if(subjectMap.containsKey(uri)){
subjectMap.get(uri).onNext(查询(uri));
}
}
};
然后在get方法中,构建对象,将其包装在行为主题中,并在返回可观察对象之前将其添加到地图中:
public Observable<T> getFoo(U id) {
Uri uri = getUriForId(id);
if (!subjectMap.containsKey(uri)) {
subjectMap.put(uri, BehaviorSubject.create(query(id)));
}
return subjectMap.get(uri);
}
公共可观察的getFoo(U id){
Uri=getUriForId(id);
如果(!subjectMap.containsKey(uri)){
subjectMap.put(uri,BehaviorSubject.create(查询(id));
}
返回subjectMap.get(uri);
}
你找到什么了吗?@Dima没有,我用的是codeabove@vandzi也许你可以看看SQLbrite或者这个
public Observable<T> getFoo(U id) {
Uri uri = getUriForId(id);
if (!subjectMap.containsKey(uri)) {
subjectMap.put(uri, BehaviorSubject.create(query(id)));
}
return subjectMap.get(uri);
}