Я столкнулся с проблемой, которая сводит меня с ума.
У меня есть 4 фрагмента внутри действия. Лог c: FragA -> FragB -> Frag C -> FragD -> FragA -> ...
Я подключен к веб-сокетам, которые публикуют значения liveata. Чтобы перейти от FragB к Frag C, я жду события. В первый раз все работает нормально, веб-сокеты получены, событие запущено, и я собираюсь на Frag C.
Но, во второй раз (после Frag D -> Frag A), если Я go возвращаюсь к fragB, то же самое событие запускается еще раз. Пользователь не видит FragB и прибывает на Frag C.
. Это реальное поведение, но я не ожидаю этого.
У меня есть некоторые исследования и Я думаю, что это потому, что дважды активен жилатата, это нормальное поведение. И это может быть только отправка в главном потоке, поэтому, если мой фрагмент попадает в задний стек, он будет ждать, пока он снова станет активным.
Я попытался удалитьObserver в onDestroyView (), он работает и наблюдатель удаляется, но как только фрагмент снова попадает внутрь onActivityCreated (), и я наблюдаю liveata, наблюдатель мгновенно срабатывает ... Я всегда использую "viewLifecycleOwner" в качестве владельца.
Есть ли способ отменить выполнение liveData, если я когда-нибудь go вернусь к созданному фрагменту?
Все мои фраги расширяют ScopeFragment:
abstract class ScopedFragment : Fragment(), CoroutineScope {
private lateinit var job: Job
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Main
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job()
}
override fun onDestroy() {
super.onDestroy()
job.cancel()
}
}
Мои liveData:
class MyLiveDatas {
private val _myLiveData = MutableLiveData<CustomType>()
val myLiveData: LiveData<CustomType>
get() = _myLiveData
fun customTrigger(webSocketMessage: WebSocketMessage) {
val createdCustomType = CreatedCustomType(webSocketMessage)
_myLiveData.post(createdCustomType)
}
}
My Фрагмент:
class MyFragment: ScopedFragment(), KodeinAware {
override val kodein by closestKodein()
private val myLiveData: MyLiveDatas by instance()
private val myLiveDataObserver = Observer<CustomType> { customType ->
... my actions
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
myLiveDatas.myLiveData.observe(viewLifecycleOwner, myLiveDataObserver)
}
override fun onDestroyView() {
super.onDestroyView()
myLiveDatas.myLiveData.removeObserver(myLiveDataObserver)
// I've also try removeObservers with viewLifecycleOwner
}
}
Большое спасибо!