Как заставить (вернуться) не работать, пока не закончится (дооснащение) - PullRequest
0 голосов
/ 02 апреля 2020

привет Я пытаюсь изучить dataBinding, mvvm, retrofit и rx java

в 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 я использовал модификацию с Rx Java код

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 ())

и

return Observable.just (модель)

работают до

Api.getData.getMainCategory (id)

, поэтому сначала выводится в Logcat testingModel2, и он пуст, затем testingModel1, и он имеет данные

, поэтому данные результата в

return Observable.just (модель)

- ничто

Надеюсь, вы понимаете ^ _ ^

Спасибо за помощь

1 Ответ

0 голосов
/ 02 апреля 2020

сделать как:

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) испустить что-то, что может занять время.

...