我的应用程序有一个包含4个片段的viewpager。我想用我服务器上的数据填充所有片段。我在活动中加载数据,我想将其分发给所有片段。
所以我有这个签名:
@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应该直接与Subject进行交流,我不知道该怎么做......)
感谢任何帮助!
答案 0 :(得分:1)
您的问题是此操作只是获取列表的当前值而不对更新做出反应(为什么要这样做?):
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()
}