android / kotlin - Дооснащение с помощью CompositeDisposal (RXjava2) не go для ответного / бросаемого блока при нажатии кнопки назад - PullRequest
1 голос
/ 27 января 2020

В Kotlin, открывая деятельность или фрагмент, я могу вызвать API в этом формате и получить ответ без каких-либо проблем:

 compositeDisposable.add(dataManager 
                    .getHistory()
                    .subscribeOn(schedulerProvider.io())
                    .observeOn(schedulerProvider.ui())
                    .subscribe({ response ->
                        isSwipeRefreshCalled.set(false)
                        setIsLoading(false)
                        if (response.isSuccessful) {
                            setHasErrorMessage(false)


                            navigator.getHistory()

                        } else {
                            setHasErrorMessage(true)
                            navigator.showErrorMessage(response.responseMessage)
                        }
                    }, { throwable ->
                        setIsLoading(false)
                        isSwipeRefreshCalled.set(false)
                        navigator.handleError(throwable)
                    })
            )

, но всякий раз, когда я нажимал backButton и go Возвращаясь к этому действию / фрагменту, несмотря на то, что CompositeDisposable был вызван, ничего не произошло, и ни блок ответа не был вызван, ни исключение.

Следует отметить, что compositeDisposable.dispose() вызывается, когда действие / фрагмент уничтожен (onDestroy () / onDestroyView ())

Рад, что кто-то помог мне.

1 Ответ

1 голос
/ 27 января 2020

это слишком большой комментарий. Я не уверен, что это проблема, но я заметил кое-что в описании проблемы.

Из комментариев и собранного мной вопроса вы делаете что-то вроде:

onViewCreated:
   // add to composite disposable

onViewDestroyed:
   // dispose the composite disposable

Проблема в том, что когда вы звоните compositeDisposable.dispose(), вы фактически делаете этот составной одноразовый материал непригодным для использования. Другими словами, каждый раз, когда вы пытаетесь добавить одноразовый материал, он не будет работать, потому что составной одноразовый материал уже утилизирован. Это может быть проблемой, если составной одноразовый материал остается в памяти, т. Е. Если он используется в качестве поля viewModel, которое не воссоздается. В следующий раз, когда вы приедете и будете использовать тот же составной одноразовый материал, он не будет работать.

Вместо этого вы можете использовать compositeDisposable.clear(), который удалит все одноразовые материалы из контейнера и утилизирует их. , Однако контейнер не утилизируется и может использоваться для большего количества одноразовых изделий.

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