App utilise RxJava pour effectuer un appel réseau, puis modifier les résultats avec les données de la base de données et les afficher. L'application écoute les modifications de la base de données avec android.database.ContentObserver et modifie les données en cas de modification. Actuellement, il fonctionne avec le code ci-dessous, mais y at-il une façon plus agréable RX comment y parvenir? Merci!rxjava et android.database.contentobserver
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);
Avez-vous trouvé quelque chose? – Dima
@Dima Non, j'utilise le code ci-dessus – vandzi
@vandzi Peut-être que vous pouvez jeter un oeil à SQLbrite https://github.com/square/sqlbrite ou celui-ci https://github.com/yahoo/squidb/wiki/Observing- avec-RxJava – box