如何处理 rxJava 和协程

问题描述

我在我的项目中使用了 RxJava,现在我正在将逻辑从 observable 更改为协程。但我被困在 UI 点击是基于 rx 而 api 是基于挂起的,它不喜欢它。

有关如何解决此问题的任何建议

Fragment.java - 这是我的 UI 按钮

  @Override
    public Observable<Void> getStartSeeingObservable() {
        return RxView.clicks(dataViewHolder.btnStartSeeing);
    }

Presenter.kt

 subscriptions += view.startSeeingObservable
        .onBackpressureLatest()
        .doOnNext { view.showLoader(false) }
        .flatMap {
            if (!hasOpenInopIncidents()) {
                startSeeingUseCase(StartSeeingUseCase.Params(equipmentProvider.get()!!)) // this use case is not based on coroutines and its response is not an observable
            } else {
                val incidentOpenResponse = GenericResponse(false)
                incidentOpenResponse.error = OPEN_INCIDENTS
                Observable.just(incidentOpenResponse)
            }
        }
        .subscribe(
            { handleStartSeeingClicked(view,it) },{ onStartSeeingError(view) }
        )

用例

@PerApp
class StartSeeingUseCase  @Inject constructor(
private val currentOrderStorage: CurrentOrderStorage,private val seeOrderRepository: SeeOrderRepository,private val app: App
): UseCaseCoroutine<GenericResponse,StartSeeingUseCase.Params>() {

    override suspend fun run(params: Params): GenericResponse {

        val startTime = DateTime()
        val action = TimestampedAction(
            app.session.user.id,null,startTime
        )
        try {
            return seeOrderRepository.startSeeing(
                currentOrderStorage.seeOrder!!.id,action
            )
        } catch (exception: Exception) {
            exception.message?.let { onError(it) }
            return GenericResponse(false)
        }
    }

    private fun onSuccess(startTime: DateTime,equipment: Equipment) {
        if (currentOrderStorage.getSeeOrder() == null) return
        currentOrderStorage.getSeeOrder()!!.setStatus(SeeOrderData.STATUS_SeeING)
        equipment.times.start = startTime
        app.saveState()
    }

    private fun onError(errorMessage: String) {
        Timber.e(errorMessage,"Error calling started seeing! %s",errorMessage)
    }

    data class Params(val equipment: Equipment)
}

abstract class UseCaseCoroutine<out Type,in Params> where Type : Any {

    abstract suspend fun run(params: Params): Type

    operator fun invoke(params: Params,onResult: (type: Type) -> Unit = {}) {
        val job = GlobalScope.async(Dispatchers.IO) { run(params) }
        GlobalScope.launch(Dispatchers.Main) { onResult(job.await()) }
    }
}

错误是get是

enter image description here

你能建议如何解决这个问题吗

谢谢 R

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)