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

应用程序使用RxJava进行网络调用,然后使用数据库中的数据修改结果并显示它们。应用程序使用android.database.ContentObserver侦听数据库更改,并在发生更改时修改数据。目前,它与下面的代码一起工作,但有没有更好的方法来实现同样的效果? 谢谢

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);
}