Хорошая практика - использовать postDelayed для задержки открытия фрагмента? - PullRequest
0 голосов
/ 14 июля 2020

Я делаю приложение на основе базы данных TMDB. У меня есть recyclerView, в котором загружены новейшие телешоу. Когда я нажимаю на плакат, я вызываю API TMDB, получаю объект с информацией о шоу и открываю фрагмент, загруженный с данными этого объекта.

Дело в том, что я go возвращаюсь и нажимаю на другом телевизоре show, когда фрагмент открывается снова, он кратко показывает информацию о предыдущем телешоу, которое я щелкнул.

Я думаю, проблема в том, что я использую liveata для передачи данных между моделью просмотра и фрагментом, и это загрузка данных уже в liveata. Итак, я использую это, чтобы немного задержать открытие фрагмента:

HomeFragment - OnCLick

viewmodel.getShowDetails(showId)

val mHandler = Handler()
val monitor = Runnable {
   Navigation.findNavController(view)
             .navigate(HomeFragmentDirections.actionHomeToShowDetail())
}

mHandler.postDelayed(monitor, 300)

ViewModel

  private var showMutable = MutableLiveData<ShowDetails>()

    fun getShowData(id: Int) {
        TmdbRepository.getDetails(id) // This returns an RxJava Observable
            .observeOn(Schedulers.io())
            .doOnError(Throwable::printStackTrace)
            .subscribe {
                showMutable.postValue(it)
            }
    }


    fun getShow(): LiveData<ShowDetails> {
        return showMutable
    }

ShowDetailFragment

override fun onCreateView(
     viewModel.getShow().observe(viewLifecycleOwner, Observer {
            mShow = it
            setData(mShow) // this fills the textviews, images, etc
     })
}

Хорошо ли пользоваться этим методом? Или, может быть, мне следует использовать что-то еще для передачи данных между фрагментом и моделью просмотра вместо живых данных?

Спасибо.

1 Ответ

0 голосов
/ 14 июля 2020

К сожалению, использовать postDelayed .

, поскольку ваша ViewModel является общей, вы MutuableLiveData будет хранить данные, если предыдущий Mov ie Details.

Решение этой проблемы может иметь 2 формы:

Первое решение , Use StateUi, включает Загрузка , Успех , Ошибка как показано ниже:

sealed class StateUi {
    data class Success(val data: Any) : StateUi()
    object Loading : StateUi()
    class Error(val throwable: Throwable) : StateUi()
}

также добавьте StateUi.Loading в doOnSubscribe () следующим образом:

TmdbRepository.getDetails(id) // This returns an RxJava Observable
        .observeOn(Schedulers.io())
        .doOnSubscribe(StateUi.Loading)
        .doOnError(Throwable::printStackTrace)
        .subscribe {
            showMutable.postValue(it)
        }

Сделайте ваши MutuableLiveData следующим образом

private var showMutable = MutableLiveData<StateUi<ShowDetails>>()

и обратите внимание в своем фрагменте, как это решит вашу проблему?

Второе решение , создать отдельный класс ViewModel для каждого фрагмента. Но я рекомендую первое решение.

...