![](/img/trans.png)
[英]Is non-observable model object in the ViewModel against MVVM architecture in Android?
[英]How to call non-observable code from rxjava chain
我已經在演示者中實現了rxjava調用鏈。 它的作用是,如果sqlite數據庫未返回任何結果,它將調用經過改造的遠程服務器。
但是,除我們的調用sqlite的存儲庫外,所有東西都使用rxjava。 當sqlite返回結果時,例如顯示3個具有空值的結果。 從rxjava鏈中調用不可觀察的代碼似乎不起作用? 不使用StorIO或Brite怎么辦?
結果看起來像這樣
主持人
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
restartableLatestCache(REQUEST_ASSIGNMENTS,
() -> mRepository.query()
.subscribeOn(Schedulers.io())
.observeOn(mainThread()),
(assignmentActivity, response) -> assignmentActivity.onSuccess(response),
(assignmentActivity, throwable) -> assignmentActivity.onError(throwable)
);
}
資料庫
return mAssignmentLocalDataStore.query(new AssignmentSpecification())
.flatMap(assignments -> assignments == null || assignments.isEmpty() ?
mAssignmentRemoteDataStore.query()
.flatMap(remoteAssignments ->
Observable.zip(
mEntityRepository.query()
.flatMap(mEntityRepository::add),
mFacilityRepository.query()
.flatMap(mFacilityRepository::add),
mAssignmentLocalDataStore.query(new AssignmentSpecification()),
(remoteEntities, remoteFacilities, assignmentsRetry) -> assignmentsRetry
)
): Observable.just(assignments)
);
SQLite LocalDataStore
@Override
public Observable<List<Assignment>> query(Specification specification) {
final SqlSpecification sqlSpecification = (SqlSpecification) specification;
final SQLiteDatabase database = mOpenHelper.getReadableDatabase();
final List<Assignment> assignments = new ArrayList<>();
try {
final Cursor cursor = database.rawQuery(sqlSpecification.toSqlQuery(), new String[]{});
for (int i = 0, size = cursor.getCount(); i < size; i++) {
cursor.moveToPosition(i);
assignments.add(mToAssignmentMapper.map(cursor));
}
cursor.close();
return Observable.just(assignments);
} finally {
database.close();
}
}
將query
更改為以下內容(使用Observable.create
)。 此方法的另一個變體是返回Observable<Assignment>
並為每個記錄調用subscriber.onNext
。
@Override
public Observable<List<Assignment>> query(Specification specification) {
return Observable.create(subscriber -> {
final SqlSpecification sqlSpecification = (SqlSpecification) specification;
final SQLiteDatabase database = mOpenHelper.getReadableDatabase();
final List<Assignment> assignments = new ArrayList<>();
try {
final Cursor cursor = database.rawQuery(sqlSpecification.toSqlQuery(), new String[]{});
for (int i = 0, size = cursor.getCount(); i < size; i++) {
cursor.moveToPosition(i);
assignments.add(mToAssignmentMapper.map(cursor));
}
subscriber.onNext(assignments);
cursor.close();
} finally {
database.close();
subscriber.onCompleted();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.