Использование одного и того же наблюдателя в нескольких фрагментах и ​​получение ответа только в видимом фрагменте, а не в обратном стэке - PullRequest
0 голосов
/ 23 февраля 2020

Я использую Rx Java, чтобы использовать API в моем приложении android. Проблема здесь в том, что если использовать один и тот же наблюдатель в двух фрагментах, и один фрагмент находится в backstack, а другой находится сверху, то ответ получен в обоих фрагментах, но это не то, что я хочу. Точный случай здесь:

При нажатии кнопки выполняется запрос API с использованием:

userModel.hitAPi("12", myList)

и наблюдается с использованием:

 val obs = userModel.responseAPI.observe(this,
            Observer {
                if (it != null) {
                    if(it.httpCode == 200)
                        Log.e(TAG, "Response: " + it.toString())
                    else{
                        Log.e(TAG, "Response: " + it.toString())
                    }
                }
            })

Вот класс ViewModel :

 class UserViewModel: ViewModel() {

    private val cd = CompositeDisposable()
    val status: MutableLiveData<Boolean>? = MutableLiveData<Boolean>()

    val responseAPI = MutableLiveData<ResponseAdd>()
    fun hitAPi(userID: String, items: ArrayList<Item>){
        val myModel = ModelAdd("",items,"in",userID,"" )
        cd.add(
            RetrofitHelper.apiInstance.addToCart(myModel)
                .myApiSubscriber(status)
                .subscribe({
                    responseAPI.postValue(it)
                },{
                    it.printStackTrace()
                })
        )
    }

       private fun <T> Single<T>.myApiSubscriber(status: MutableLiveData<Boolean>?): Single<T> {
        return this.doOnSubscribe {
            status?.postValue(true)
            Utils.debugger("PROGRESS ", " doOnSubscribe")
        }.doFinally {
            status?.postValue(false)
            Utils.debugger("PROGRESS ", " doFinally")
        }.subscribeOn(Schedulers.io())
    }

    override fun onCleared() {
        cd.dispose()
        super.onCleared()
    }
}

теперь перед приходом ответа, если пользователь переключается на другой фрагмент, у которого тоже есть тот же Наблюдатель, после чего ответ получен в этом фрагменте, так как мне избавиться от него перед миграцией на другой фрагмент?

1 Ответ

0 голосов
/ 23 февраля 2020

Этот вопрос в настоящее время испытывает недостаток во многих деталях, кажется, что мы говорим в псевдокоде. Что такое "тот же наблюдатель"? Где эти Observable подписаны? Оба Fragment хотят получить результат вызова API, но только в зависимости от того, что в данный момент отображается на экране? Затем вы захотите отделить жизненный цикл вызова API от Fragment и попросить Fragment наблюдать что-то, что обновляется в результате вызова API (например, базы данных).

Когда вы .subscribe() Observable возвращает объект Disposable, это ссылка, которую вы можете вызвать dispose(), когда Fragment равен onPause() (или некоторому другому подходящему жизненному циклу).

...