【问题标题】:React to retrofit call对改造电话做出反应
【发布时间】:2016-11-09 15:46:55
【问题描述】:

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

所以我有这个签名:

@GET("trashCan")
fun getTrashCans() : Observable<List<TrashCanDto>>

然后我调用该方法并填充一个列表。

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 没有什么可提供的......但是当视图分页器在第四个片段中获取时,列表不再为空,所以我的屏幕显示数据。

我的问题是:如何让 Activity 中的 Observable 不断将数据推送到 Fragment 中? 现在,它只在订阅 Observable 时才推送数据...我想更改这个,所以当有新数据时它会推送。

(我认为第一个 Observable 应该直接与 Subject 通信,有点我不知道该怎么做......)

感谢任何帮助!

【问题讨论】:

  • BehaviorSubject.from(mTrashCanList) - 它只取列表的当前值。它不会对列表更新做出反应。
  • 感谢您的快速响应。这是我问题的关键点......我不知道如何让它对更新做出反应

标签: android android-fragments rx-java kotlin


【解决方案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()
}

【讨论】:

  • 看起来很不错!我不知道 share() 方法。今晚我会试一试,然后告诉你
  • 我刚刚尝试了代码。这仍然不是我想要的......每次在视图寻呼机中切换片段时,它们都会再次访问服务器。我希望它只点击一次,或者当我按下一个按钮时,并对新值做出反应。现在它每次订阅时都会访问服务器......我的目标是获取 Retrofit 返回的最后一个值,而不是再次使用 Retrofit。我相信我需要一个主题...但不确定女巫一个
  • ReplaySubject,也许吧?
  • @EpicPandaForce 我假设需要缓存来自服务器的最后一个数据(通常只有一项,因为这是改造)
  • 哦,是的。这就说得通了。 BehaviorSubject 已经这样做了吗?因为那我的评论是无关紧要的(对不起,我对主题或relays 或其他什么感到困惑)
猜你喜欢
  • 2016-08-09
  • 2021-02-18
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
相关资源
最近更新 更多