Android 对改装电话作出反应

Android 对改装电话作出反应,android,android-fragments,rx-java,kotlin,Android,Android Fragments,Rx Java,Kotlin,我有一个应用程序,它有一个带有4个片段的viewpager。我想用服务器上的数据填充所有片段。我将数据加载到活动中,并希望将其分发到所有片段 所以我有这个签名: @GET("trashCan") fun getTrashCans() : Observable<List<TrashCanDto>> @GET(“垃圾桶”) 有趣的getTrashCans():可观察 我调用该方法并填充一个列表 ServiceGenerator.createService(ApiClien

我有一个应用程序,它有一个带有4个片段的viewpager。我想用服务器上的数据填充所有片段。我将数据加载到活动中,并希望将其分发到所有片段

所以我有这个签名:

@GET("trashCan")
fun getTrashCans() : Observable<List<TrashCanDto>>
@GET(“垃圾桶”)
有趣的getTrashCans():可观察
我调用该方法并填充一个列表

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
                    }
                })
ServiceGenerator.createService(ApiClient::class.java)
.getTrashCans()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(对象:Subscriber(){
覆盖未完成的乐趣(){
显示进度(错误)
}
覆盖有趣的错误(e:可丢弃){
显示进度(错误)
Toast.makeText(this@TrashCansInfoActivity“Erro ao carregar informações”,
吐司。长度(短)。show()
e、 printStackTrace()
}
覆盖fun onNext(垃圾箱列表:列表){
mTrashCanList=垃圾箱列表
}
})
然后我有一个方法从这个列表中得到一个可观察的:

override fun getObservable(): Observable<TrashCan> {
    return BehaviorSubject.from(mTrashCanList)
}
getObservable():Observable{
返回行为subject.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
        }
funNewInstance(sectionNumber:Int,hasObservable:hasObservable):垃圾箱新碎片{
val fragment=TrashCansInfoFragment()
fragment.setObservable(hasObservable.getObservable())
val args=Bundle()
args.putInt(ARG\u节号,节号)
fragment.arguments=args
返回片段
}
嗯。。。这应该行得通,但不行。碰巧我的第一个片段是空的,而第四个片段有数据。(第二个和第三个不应该有任何数据……而且他们没有)

所以我认为:当片段被创建时,列表仍然是空的,所以活动中的可观察对象没有任何可提供的东西。。。但是当查看页面进入第四个片段时,列表不再为空,因此我的屏幕显示数据

我的问题是:如何使活动中的可观察对象不断将数据推送到片段中?现在,它只在订阅可观察对象时推送数据。。。我想改变这一点,这样当有新数据时它就会推送

(我认为第一个可观察到的物体应该直接与主体沟通,但我不知道该怎么做…)


感谢您的帮助

您的问题是,此操作只获取列表的当前值,不会对更新做出反应(为什么要这样做?):

作为活动中的一个选项,您可以将您的
行为主体
订阅到
可观察的

ServiceGenerator.createService(ApiClient::class.java)
            .getTrashCans()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(yourSubject)
然后返回它而不是您的主题:

override fun getObservable(): Observable<TrashCan> {
    return yourSubject.asObservable()
}
getObservable():Observable{
返回您的主题。asObservable()
}

行为主体。从(mTrashCanList)
-它只获取列表的当前值。它不会对列表更新做出反应。感谢您的快速响应。这是我问题的关键。。。我不知道如何让它对看起来很好的更新做出反应!我不知道share()方法。今晚我试试,告诉你我刚试过密码。这仍然不是我想要的。。。每次在视图寻呼机中切换片段时,它们都会再次命中服务器。我希望它只点击一次,或者当我按下一个按钮时,对新的值做出反应。现在,它只是在每次订阅时击中服务器。。。我的目标是获取翻新返回的最后一个值,而不是再次使用翻新。我想我需要一个主题。。。但不确定是否需要重新播放主题?@EpicPandaForce我假设服务器上的最后一个数据(通常只有一项,因为这是改装)需要缓存是的。这是有道理的。行为主体已经这么做了吗?因为我的评论是不相关的(对不起,我把话题弄糊涂了)
override fun getObservable(): Observable<TrashCan> {
    return yourSubject.asObservable()
}