0

KotlinでAndroidアプリを開発しています。3 つのリアルタイム データ オブザーバブルがあります。データは Firestore から取得されます。それらは RxJava の Observable.combineLatest() メソッド内にラップされます。最初のデータ取得時にタイムアウトを設定したい。

各オブザーバブルにタイムアウト関数を設定しようとしましたが、3 つのオブザーバブルすべてからの初期データが読み込まれた後に TimeoutException をスローします。

private fun retrieveAllData() {
Observable.combineLatest(
                retrieveDataObservable1().timeout(10, TimeUnit.SECONDS),
                retrieveDataObservable2().timeout(10, TimeUnit.SECONDS),
                retrieveDataObservable3().timeout(10, TimeUnit.SECONDS),
                Function3<String, String, Boolean, Triple<String, String, Boolean>>
                { firstResult, secondResult, ThirdResult ->
                    Triple(firstResult, secondResult, ThirdResult)
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        { Log.d(TAG, "success") },
                        { throwable -> Log.d(TAG, "error", throwable) }
                )
}

private fun retrieveDataObservable1(): Observable<String> {
        return Observable.create<String> { emitter ->
            val listener = dataRef1.addSnapshotListener { snapshot, e ->
                if (e != null) {
                    emitter.onError(e)
                    return@addSnapshotListener
                }
                emitter.onNext("some value")
            }
         emitter.setCancellable { listener.remove() }
     }
}

Observable の少なくとも 1 つが 10 秒以内にアイテムを発行しなかった場合、最初の取得時に Observable.combineLatest() から TimeoutExceiption が発生することが予想されます。すべてのオブザーバブルがデータを少なくとも 1 回正常に発行した場合、TimeoutException は発生しません。

4

1 に答える 1