我是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)
}
})
}
}
虽然我怀疑onNext
NOT当观察者退订此不会出现这样的情况
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
,你可以看到最后一次通话是退订被称为和(你不能在这里看到,但这是因为我有par
结果而不是pari
结果),即使它没有订阅,doOnNext
闭包也会在我的可观察值上执行。
我已经深入互联网,发现this这似乎描述了同样的问题,除非我根本没有使用cache
。
这里是我的电话订购:
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