gpt4 book ai didi

android - rxjava 和 android.database.contentobserver

转载 作者:太空狗 更新时间:2023-10-29 14:53:33 26 4
gpt4 key购买 nike

应用程序使用RxJava 进行网络调用,然后用数据库中的数据修改结果并显示出来。 App通过android.database.ContentObserver监听数据库变化,有变化时修改数据。目前它可以与下面的代码一起使用,但是有没有更好的 RX 方式如何实现相同的?谢谢!

Observable<ArrayList<Foo>> observable = Observable.create(new Observable.OnSubscribe<ArrayList<Foo>>() {

@Override
public void call(Subscriber<? super ArrayList<Foo>> subscriber) {
//make api call and get list of foos
ArrayList<Foo> apiResults = api.getFooList();
//loop results and if foo is already in local sqlite db, update it with local values
for (Foo foo : apiResults) {
if(localSqlite.contains(foo){
foo.update(localSqlite.get(foo));
}
}

subscriber.onNext(apiResults);

HandlerThread observerThread = new HandlerThread("ContentObserver-thread");
observerThread.start();
final ContentObserver co = new ContentObserver(new Handler(observerThread.getLooper())) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);

for (Foo foo : apiResults) {
if(localSqlite.contains(foo){
foo.update(localSqlite.get(foo));
}

subscriber.onNext(apiResults);
}

mContext.getContentResolver().registerContentObserver(uri, true, co);

subscriber.add(Subscriptions.create(new Action0() {
@Override
public void call() {
mContext.getContentResolver().unregisterContentObserver(co);
}
}));

}


Subscription subscription = observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);

最佳答案

box 调查 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));
}
}
};

然后在您的 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);
}

关于android - rxjava 和 android.database.contentobserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33365959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com