RxJava在可观察对象中处理多个回调

RxJava在可观察对象中处理多个回调,java,android,kotlin,observable,rx-java2,Java,Android,Kotlin,Observable,Rx Java2,我有一个可观察的,里面有多个回调。第一个从服务器获取列表,第二个是itemchange回调,它告诉您列表中的项是否已更改。这是我当前的实现: Flowable.create({ emitter -> val offlineManager = OfflineManager.getInstance(context) offlineManager.listOfflineRegions(object : OfflineManager.ListOfflineRegi

我有一个
可观察的
,里面有多个回调。第一个从服务器获取列表,第二个是itemchange回调,它告诉您列表中的项是否已更改。这是我当前的实现:

Flowable.create({ emitter ->
        val offlineManager = OfflineManager.getInstance(context)

        offlineManager.listOfflineRegions(object : OfflineManager.ListOfflineRegionsCallback {

            override fun onList(offlineRegions: Array<OfflineRegion>) {
                offlineRegionsFetch(offlineRegions, emitter)
            }

            override fun onError(error: String) {
                emitter.onError(IllegalStateException("Saved offline regions read error"))
            }
        })
    }, BackpressureStrategy.BUFFER)

   private fun offlineRegionsFetch(offlineRegionList: Array<OfflineRegion>, emitter: FlowableEmitter<List<OfflineMap>>) {

    if (offlineRegionList.isNotEmpty()) {
        val count = 0

        val offlineMaps = offlineRegionList.map { OfflineMap(it.id.toString(), OfflineMapManager.getRegionName(it), 0L, OfflineMapStatus(FETCH)) } as ArrayList<OfflineMap>

        offlineRegionList.forEachIndexed { index, offlineRegion ->
            offlineRegion.getStatus(object : com.mapbox.mapboxsdk.offline.OfflineRegion.OfflineRegionStatusCallback {

                override fun onStatus(status: OfflineRegionStatus) {
                    if (status.isComplete) {
                        offlineMaps[index] = OfflineMap(offlineRegion.id.toString(), OfflineMapManager.getRegionName(offlineRegion), status.completedResourceSize, OfflineMapStatus(SUCCESS))
                        count + 1
                    } else if (status.downloadState == OfflineRegion.STATE_INACTIVE) {
                        offlineMaps[index] = OfflineMap(offlineRegion.id.toString(), OfflineMapManager.getRegionName(offlineRegion), status.completedResourceSize, OfflineMapStatus(PAUSED))
                        count + 1
                    } else if (!status.isRequiredResourceCountPrecise) {
                        offlineMaps[index] = OfflineMap(offlineRegion.id.toString(), OfflineMapManager.getRegionName(offlineRegion), 0L, OfflineMapStatus(DOWNLOAD_STARTED))
                        count + 1
                    } else if (!status.isComplete && status.isRequiredResourceCountPrecise) {
                        val percentage = 100.0 * status.completedResourceCount / status.requiredResourceCount
                        offlineMaps[index] = OfflineMap(offlineRegion.id.toString(), OfflineMapManager.getRegionName(offlineRegion), status.completedResourceSize,
                                OfflineMapStatus(PROGRESS, offlineRegion.id.toString(), Math.round(percentage)))
                        count + 1
                    }
                }

                override fun onError(error: String) {
                    offlineMaps[index] = OfflineMap(offlineRegion.id.toString(), OfflineMapManager.getRegionName(offlineRegion), -1L,
                            OfflineMapStatus(ERROR, offlineRegion.id.toString(), errorCode = errorMap(error), errorMsg = error))
                    count + 1
                }
            })
        }

        if (count == offlineRegionList.size) {
            emitter.onNext(offlineMaps)
        }
    } else {
        emitter.onNext(listOf())
    }
}
Flowable.create({emitter->
val offlineManager=offlineManager.getInstance(上下文)
offlineManager.listOfflineRegions(对象:offlineManager.ListOfflineRegionsCallback{
覆盖联机列表(脱机区域:阵列){
OfflineRegionFetch(offlineRegions,发射器)
}
重写错误(错误:字符串){
emitter.onError(IllegalStateException(“保存的脱机区域读取错误”))
}
})
},背压等级。缓冲器)
private fun OfflineRegionFetch(offlineRegionList:Array,emitter:FlowableEmitter){
if(offlineRegionList.isNotEmpty()){
val计数=0
val offlineMaps=offlineRegionList.map{OfflineMap(it.id.toString(),OfflineMapManager.getRegionName(it),0L,OfflineMapStatus(FETCH))}作为ArrayList
offlineRegionList.ForeAchinedExed{索引,offlineRegion->
offlineRegion.getStatus(对象:com.mapbox.mapboxsdk.offline.offlineRegion.OfflineRegionStatusCallback{
覆盖状态(状态:OfflineRegionStatus){
如果(状态为isComplete){
offlineMaps[索引]=OfflineMap(offlineRegion.id.toString(),OfflineMapManager.getRegionName(offlineRegion),status.completedResourceSize,OfflineMapStatus(成功))
计数+1
}else if(status.downloadState==OfflineRegion.STATE\u INACTIVE){
offlineMaps[索引]=OfflineMap(offlineRegion.id.toString(),OfflineMapManager.getRegionName(offlineRegion),status.completedResourceSize,OfflineMapStatus(暂停))
计数+1
}如果(!status.isrequiredResourceCountPrecision)为else,则为{
offlineMaps[索引]=OfflineMap(offlineRegion.id.toString(),OfflineMapManager.getRegionName(offlineRegion),0L,OfflineMapStatus(下载已启动))
计数+1
}如果(!status.isComplete&&status.isrequiredResourceCountPrecision)为else,则为{
val百分比=100.0*status.completedResourceCount/status.requiredResourceCount
offlineMaps[index]=OfflineMap(offlineRegion.id.toString(),OfflineMapManager.getRegionName(offlineRegion),status.completedResourceSize,
OfflineMapStatus(PROGRESS,offlineRegion.id.toString(),Math.round(percentage)))
计数+1
}
}
重写错误(错误:字符串){
offlineMaps[index]=OfflineMap(offlineRegion.id.toString(),OfflineMapManager.getRegionName(offlineRegion),-1L,
OfflineMapStatus(错误,offlineRegion.id.toString(),errorCode=errorMap(错误),errorMsg=ERROR))
计数+1
}
})
}
if(count==offlineRegionList.size){
emitter.onNext(离线贴图)
}
}否则{
emitter.onNext(listOf())
}
}
这里的
onNext
甚至不会发生,因为状态回调是异步的。如何使
onNext
等待回调,然后触发。还有它的
n
状态回调次数,其中
n
是列表中的项目数