对改装电话做出反应

时间:2016-11-09 15:46:55

标签: android android-fragments rx-java kotlin

我的应用程序有一个包含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进行交流,我不知道该怎么做......)

感谢任何帮助!

1 个答案:

答案 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()
}