使用Firebase Tasks和Rx

时间:2018-07-18 23:58:59

标签: android firebase firebase-realtime-database kotlin rx-java2

我有一个代码,可以从数据库中获取用户喜欢的啤酒的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)

1 个答案:

答案 0 :(得分:0)

无法在主UI线程上运行的是Task.await(task)

我有一个名为FirebaseOCR()的函数,其中带有Task.await()

Thread(Runnable {
FirebaseOCR()
}).start()