最初はAndroidには新しいですが、iOSの世界からはRxSwiftを広範囲に使用し、非常に奇妙な動作を見つけました。Android RxJava onNextはオブザーバーが登録解除されているときでも呼び出されます
RxJava Observable
(私はRxJavaCallAdapterFactory
を使用していませんが、ここではそれが問題ではないと思います)に改造呼び出しをカプセル化します。
fun SearchService.rx_myObjects(query: String?): Observable<List<MyClass>> {
return Observable.create { observer ->
val request = getMyObjects(query = query)
request.enqueue(object : Callback<MyClass>() {
override fun onSuccess(result: MyClass) {
Log.v("TEST", "is unsubscribed ${observer.isUnsubscribed} for query $query")
observer.onNext(result)
observer.onCompleted()
}
override fun onError(error: APIError) {
observer.onError(error)
}
})
}
}
そして、私はその観察者が解除されたときに、これはあなたが最後の呼び出しを見ることができるように、ケース
08-04 11:50:39.767 5107-5107/com.mydomain.myapp V/TEST: is unsubscribed false for query par
08-04 11:50:44.264 5107-5107/com.mydomain.myapp V/TEST: is unsubscribed true for query pari
08-04 11:50:44.653 5107-5107/com.mydomain.myapp V/TEST: is unsubscribed false for query par
08-04 11:50:46.358 5107-5107/com.mydomain.myapp V/TEST: is unsubscribed false for query pari
08-04 11:50:47.990 5107-5107/com.mydomain.myapp V/TEST: is unsubscribed false for query pari
08-04 11:50:48.033 5107-5107/com.mydomain.myapp V/TEST: is unsubscribed true for query par
ではないように呼ばれるonNext
ませが解除され疑いながら(ここでは見ることはできませんが、pari
の代わりにpar
の結果があるために起こっています)、doOnNext
クロージャが登録解除されていても私の観測で実行されます。
私はインターネットを掘り下げ、を全く使用していないこと以外は同じ問題を説明していると思われるthisを見つけました。ここで
は私のサブスクリプションの呼び出しです:
private fun retrieveMyObjects(query: String?) {
subscription = service.rx_myObjects(query = query)
.doOnError { showError(it) }
.doOnNext { this.airports = it }
.subscribe()
}
とオブジェクトが呼び出しのTextViewアップデート
search_view.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextChange(newText: String?): Boolean {
subscription?.unsubscribe()
retrieveMyObjects(newText)
return true
}
})
何かアドバイスでトリガされますか?私はここに何かを逃していますか
@dwursteisenに感謝します。これはまさに私が思ったものですが、RxSwiftにはまったく問題はありませんでした。 'AnonymousDisposable'を使用してリクエストを取り消すことができるので、少し違って動作します。 – apouche