Nach diesem tutorial habe ich zwei Quellen zum Abrufen von Daten erstellt. Ich erwarte, dass, wenn es keine Daten lokal gibt, ich Netzwerkanfrage senden werde. Aber die ganze Zeit erhalten Sie eine Liste von Null-Objekten von der lokalen Quelle (die zuerst in Observable.concat ist).RxAndroid: Observable.first() gibt die Liste der Null-Objekte zurück
Für die lokale Quelle SQLite mit SQLBrite Wrapper und für Remote-Quelle Retrofit:
@Override
public Observable<Item> get(String id) {
//creating sql query
return databaseHelper.createQuery(ItemEntry.TABLE_NAME, sqlQuery, id)
.mapToOneOrDefault(mapperFunction, null);
}
Es gibt Methode in Repository für concating Observablen:
@Override
public Observable<Item> get(String id) {
Observable<Item> local = localDataSource
.get(id)
.doOnNext(new Action1<Item>() {
@Override
public void call(final Item item) {
// put item to cache
}
});
Observable<Item> remote = remoteDataSource
.get(id)
.doOnNext(new Action1<Item>() {
@Override
public void call(final Item item) {
// save item to database and put to cache
}
});
return Observable.concat(local, remote).first();
}
Denn es mit einer Liste von IDs immer ich m mit der nächsten Methode:
@Override
public Observable<List<Item>> getList(final List<String> ids) {
return Observable
.from(ids)
.flatMap(new Func1<String, Observable<Item>>() {
@Override
public Observable<Item> call(String id) {
return get(id);
}
}).toList();
}
Und Abonnement in Fragment:
Subscription subscription = repository
.getList(ids)
.flatMap(new Func1<List<Item>, Observable<Item>>() {
@Override
public Observable<Item> call(List<Item> result) {
return Observable.from(result);
}
})
.toList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Item>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<Item> result) {
// there get list of null objects
}
});
Also, Hauptziel ist zuerst lokalen Speicher zu überprüfen und wenn es kein Element gibt - Anfrage an den Server. Aber jetzt, wenn das Element nicht existiert, bekomme ich null statt der Sendeanforderung.
Könnte jemand mir helfen zu verstehen, warum?
Es half nicht. Einziger Unterschied, dass jetzt nichts mehr zurückkommt. –
Sicher, Ihre Datenquelle Get (ID) gibt etwas anderes als null Werte zurück? –
Seltsam, localSource gibt null zurück, und danach wird die Codeausführung gestoppt. Versuchte einfache Observable, die immer null zurückgibt und es funktioniert - gehe zum nächsten Schritt mit Netzwerkanforderung. Ich suche nach einem möglichen Problem mit SQLBrite .. –