【问题标题】:How to force (return) to not work until after (retrofit) finished如何强制(返回)直到(改造)完成后才能工作
【发布时间】:2020-04-02 11:09:34
【问题描述】:

你好我正在研究dataBinding、mvvm、retrofit和rxjava

在 viewModel 中我使用了这段代码

private var mainRepository: MainRepository = MainRepository(NetManager(getApplication()))
val isLoading = ObservableField(false)
var mainModel = MutableLiveData<ArrayList<MainModel>>()
private val compositeDisposable = CompositeDisposable()

fun loadRepositories(id: Int, mainContract: MainContract) {
    isLoading.set(true)
    compositeDisposable += mainRepository
        .getData(id, mainContract)
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeWith(object : DisposableObserver<ArrayList<MainModel>>() {

            override fun onError(e: Throwable) {
                //if some error happens in our data layer our app will not crash, we will
                // get error here
            }

            override fun onNext(data: ArrayList<MainModel>) {
                mainModel.value= data
            }

            override fun onComplete() {
                isLoading.set(false)
            }
        })
}

在 MainRepository 中我使用了 RxJava 代码的改造

private val model = ArrayList<MainModel>()

fun getData(id: Int, mainContract: MainContract): Observable<ArrayList<MainModel>> {

    Api.getData.getMainCategory(id)
        .subscribeOn(Schedulers.computation())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe ({
            model.clear()
            model.addAll(it)
            AppLogger.log("testingModel1", model.toString())

        }, {
            AppLogger.log("error", "Failed to load Category : $it")
            mainContract.toast("Failed to load Category")
        })

    AppLogger.log("testingModel2", model.toString())
    return Observable.just(model)
}

如果您通知我正在使用日志查看输出数据 但我看到的是

AppLogger.log("testingModel2", model.toString())

返回 Observable.just(模型)

在之前运行

Api.getData.getMainCategory(id)

所以 Logcat testingModel2 中的输出首先是空的,然后是 testingModel1,它有数据

所以结果数据在

返回 Observable.just(模型)

什么都没有

希望你能理解^_^

感谢您的帮助

【问题讨论】:

    标签: android android-studio kotlin rx-java


    【解决方案1】:

    喜欢:

    fun getData(id: Int, mainContract: MainContract): Observable<ArrayList<MainModel>> {
    return Api.getData.getMainCategory(id)
        .subscribeOn(Schedulers.computation())
        .observeOn(AndroidSchedulers.mainThread())
    }
    

    但记得稍后订阅并添加ErrorHandling

    关于日志:subscribe 块中的操作仅在 Api.getData.getMainCategory(id) 发出某些内容时运行的问题,这可能需要一些时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2020-02-22
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多