は私がRxJavaと私のデータを保存する方法があります:SQLiteのトランザクションとRxJava
override fun put(note: Note): Observable<Note> {
validateNote(note)
return Observable.just(note)
.doOnNext { dbKeeper.startTransaction() }
.doOnNext { storeHashtags(note) }
.doOnNext { storeImages(note) }
.flatMap { notesDataStore.put(notesMapper.transform(note)) }
.map { notesMapper.transform(it) }
.doOnNext { dbKeeper.setTransactionSuccessful() }
.doOnUnsubscribe { dbKeeper.endTransaction() }
}
そして私はこのように、このメソッドを使用します。
notesManager.put(note)
.switchMap { notesManager.getHashtags() }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {view.setHashtags(it) }
そしてdoOnUnsubscribe
から選択しようとしてgetHashtags()
として呼び出されることはありませんdbはロックされたstartTransaction()
です。デッドロック、ヘイ。 doOnUnsubscribe(...)
をdoOnTerminate(...)
と置き換えてみましょう。 Observable
がsubscriber.unsubscribe()
によって中断される場合
override fun put(note: Note): Observable<Note> {
validateNote(note)
return Observable.just(note)
.doOnNext { dbKeeper.startTransaction() }
.doOnNext { storeHashtags(note) }
.doOnNext { storeImages(note) }
.map { notesMapper.transform(note) }
.flatMap { notesDataStore.put(it) }
.map { notesMapper.transform(it) }
.doOnNext { dbKeeper.setTransactionSuccessful() }
.doOnTerminate { dbKeeper.endTransaction() }
}
しかし、今のトランザクションは閉じません。
私の状況を解決するにはどうすればよいですか?
追加情報: データを書き込む/読み込むためにwritableDbインスタンスを1つ使用します。
ええ、私はすでにRxがこのケースには適していないことを理解しました。しかし、プロジェクトのアーキテクチャを変更するのは遅すぎる。あなたのソリューションに感謝します。たぶん、 'notesDataStore.put()'やそれに類するメソッドのために 'BlockingObservable'を使うでしょう。 – Alexandr
編集を追加しました。 –
面白そうです、私はそれを試してみます。ありがとう! – Alexandr