У меня есть приложение, которое имеет viewpager с 4 фрагментами. Я хочу заполнить все фрагменты данными с моего сервера. Я загружаю данные в действие, и я хочу распространять его на все фрагменты.
Итак, у меня есть эта подпись:
@GET("trashCan") fun getTrashCans() : Observable<List<TrashCanDto>>
И я вызываю метод и заполняю List.
ServiceGenerator.createService(ApiClient::class.java) .getTrashCans() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Subscriber<List<TrashCan>>(){ override fun onCompleted() { showProgress(false) } override fun onError(e: Throwable) { showProgress(false) Toast.makeText(this@TrashCansInfoActivity, "Erro ao carregar informações", Toast.LENGTH_SHORT).show() e.printStackTrace() } override fun onNext(trashCanList: List<TrashCan>) { mTrashCanList = trashCanList } })
И тогда у меня есть способ получить Observable из этого списка:
override fun getObservable(): Observable<TrashCan> { return BehaviorSubject.from(mTrashCanList) }
И я получаю тогда в своих фрагментах:
fun newInstance(sectionNumber: Int, hasObservable: HasObservable<TrashCan>) : TrashCansInfoFragment { val fragment = TrashCansInfoFragment() fragment.setObservable(hasObservable.getObservable()) val args = Bundle() args.putInt(ARG_SECTION_NUMBER, sectionNumber) fragment.arguments = args return fragment }
Ну … это должно сработать, но это не так. Бывает, что первый из моих фрагментов пуст, а у четвертых – данные. (у вторых и третьих не должно быть никаких данных … и они этого не делают)
Поэтому я думаю: когда фрагмент создается, список по-прежнему пуст, поэтому Observable в активности ничего не дает … Но когда пейджер представления получает в четвертом фрагменте, List больше не равен null, поэтому мой экран показывает данные.
Моя проблема: как заставить Observable в активности продолжать толкать данные во фрагменты? Прямо сейчас, это только толкает данные, когда Observable подзагоняется … Я хочу изменить это, поэтому он толкает, когда появляются новые данные.
(Я думаю, что первый Observable должен общаться непосредственно с Субъектом, бит, я не уверен, как это сделать …)
Любая помощь приветствуется!
Ваша проблема в том, что эта операция просто принимает текущее значение списка и не реагирует на обновления (зачем это нужно?):
BehaviorSubject.from(mTrashCanList)
В качестве одного из вариантов в вашей деятельности вы можете подписаться на свой BehaviorSubject
в Observable
:
ServiceGenerator.createService(ApiClient::class.java) .getTrashCans() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(yourSubject)
И затем верните его вместо своего Тема:
override fun getObservable(): Observable<TrashCan> { return yourSubject.asObservable() }