Как показать ProgressDialog при получении данных из ViewModel - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу показать ProgressDialog при извлечении данных из ViewModel, и он отлично работает, когда я получаю данные в первый раз, но когда я хочу обновить данные из API, ProgressDialog запускается и не останавливается

Я создаю MutableLiveData<Boolean>() и пытаюсь управлять видимостью, но она не работает

Вот как я обновляю свои данные из своей активности

private fun loadNorthTram() {
    val model =
        ViewModelProviders.of(this@MainActivity).get(MyViewModelNorth::class.java)

    model.isNorthUpdating.observe(
        this@MainActivity,
        Observer { b ->
            if (b!!)
                AppUtil.showProgressSpinner(this@MainActivity)
            else
                AppUtil.dismissProgressDialog()
        })

    model.getNorthTrams().observe(this@MainActivity, Observer
    {
        if (it != null) {
            setData(it)
        }
    })
}

Ниже представлен мой класс ViewModel

class MyViewModelNorth : ViewModel() {

    private lateinit var mtoken: String
    private val apiService: ApiInterface = ApiClient.client.create(ApiInterface::class.java)
    private lateinit var trams: MutableLiveData<TramModel>
    val isNorthUpdating = MutableLiveData<Boolean>().default(false)

    fun getNorthTrams(): MutableLiveData<TramModel> {
        isNorthUpdating.value = true
        if (!::trams.isInitialized) {
            trams = MutableLiveData()
            callTokenAPI()
        }
        return trams
    }

    private fun callTokenAPI() {
        val tokenObservable: Observable<TokenModel> = apiService.fetchToken()
        tokenObservable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnNext { self ->
                mtoken = self.responseObject[0].DeviceToken
                callTramAPI()
            }
            .subscribe(getTokenObserver())
    }

    private fun callTramAPI() {
        val apiService: ApiInterface = ApiClient.client.create(ApiInterface::class.java)
        val observable: Observable<TramModel> = apiService.fetchTrams(AppUtil.NORTH_TRAMS, mtoken)
        observable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(getTramObserver())
    }

    private fun getTokenObserver(): Observer<TokenModel> {
        return object : Observer<TokenModel> {
            override fun onComplete() {}
            override fun onSubscribe(d: Disposable) {}

            override fun onNext(tokenModel: TokenModel) {}

            override fun onError(e: Throwable) {
                if (e is HttpException) {
                    val errorBody = e.response().errorBody()
                    HttpErrorUtil(e.code()).handelError()
                }
            }
        }
    }

    private fun getTramObserver(): Observer<TramModel> {
        return object : Observer<TramModel> {
            override fun onComplete() {
                isNorthUpdating.value = false
            }

            override fun onSubscribe(d: Disposable) {}

            override fun onNext(t: TramModel) {
                if (!t.hasError && t.hasResponse)
                    trams.value = t
                else if (t.errorMessage.isBlank())
                    applicationContext().showToast(t.errorMessage)
                else
                    applicationContext().showToast(applicationContext().getString(R.string.something_wrong))
            }

            override fun onError(e: Throwable) {

                if (e is HttpException) {
                    val errorBody = e.response().errorBody()
                    HttpErrorUtil(e.code()).handelError()
                }
            }
        }
    }

    public fun getIsNothUpdating(): LiveData<Boolean> {
        return isNorthUpdating
    }

    fun <T : Any?> MutableLiveData<T>.default(initialValue: T) = apply { setValue(initialValue) }
}

1 Ответ

0 голосов
/ 03 февраля 2019

Я не проверял ваш код, но я думаю, что ваша проблема в функции getNorthTrams () в viewmodel.

При первом получении данных трамваи не инициализируются, ваш вызов API происходит и только на onCompleted, вы устанавливаете isNorthUpdating.value = false.Этот код работает.

Но когда вы обновляете данные, трамваи уже инициализированы.Таким образом, нет никакого аргумента для isNorthUpdating.value = false, что приводит к тому, что диалоговое окно прогресса не закрывается.

Так что я думаю, что вы должны обработать другой случай в вашей модели представления.

    fun getNorthTrams(): MutableLiveData<TramModel> {
    isNorthUpdating.value = true
    if (!::trams.isInitialized) {
        trams = MutableLiveData()
        callTokenAPI()
    }else{
        //do your thing for refresh
        isNorthUpdating.value = false
    }
    return trams
}

ТакжеВ вызове API, если возникает ошибка, вы должны установить для isNorthUpdating значение false и показать какое-либо сообщение об ошибке.В противном случае диалоговое окно выполнения всегда будет отображаться, даже если в вызове API произошла какая-либо ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...