簡體   English   中英

如何從rxjava鏈調用不可觀察的代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM