我有一个代码,可以从数据库中获取用户喜欢的啤酒的ID列表。然后,我使用Rx的flatMap使用beerDataSource.loadBeer(it)从数据库加载啤酒信息:
执行从以下位置开始:
loadFavoritesUseCase
.execute(Unit)
.flatMap { Observable.fromIterable(it) }
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe { (it, _) ->
info(it)
}
然后在UseCase中:
override fun execute(params: Unit): Observable<List<Beer>> {
return favoriteDataSource
.all()
.flatMap { Observable.fromIterable(it) }
.map{
info ("it: $it")
it
}
.flatMap {
beerDataSource.loadBeer(it)
}
.toList()
.toObservable()
}
还有loadBeer:
override fun loadBeer(id: String): Observable<Beer> {
return Observable.defer {
val taskSource = TaskCompletionSource<DataSnapshot>()
val ref = database.reference.child(auth.currentUser?.uid).child("cache/beers").child(id)
val listener: ValueEventListener = object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError?) {
if (databaseError != null) {
taskSource.setException(databaseError.toException())
}
}
override fun onDataChange(dataSnapshot: DataSnapshot?) {
taskSource.setResult(dataSnapshot)
}
}
ref.addListenerForSingleValueEvent(listener)
val task = taskSource.task
Tasks.await(task)
val beer = task.result.getValue(Beer::class.java)!!
return@defer Observable.just(beer)
}
}
当它触发Tasks.await时会引发异常:
> 07-18 00:25:34.545 22810-23083/br.com.alexpfx.cervejas W/System.err: io.reactivex.exceptions.OnErrorNotImplementedException: Must not be called on the main application thread
07-18 00:25:34.546 22810-23083/br.com.alexpfx.cervejas W/System.err: at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
07-18 00:25:34.547 22810-23083/br.com.alexpfx.cervejas W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
答案 0 :(得分:0)
无法在主UI线程上运行的是Task.await(task)
。
我有一个名为FirebaseOCR()的函数,其中带有Task.await()
。
Thread(Runnable {
FirebaseOCR()
}).start()