2016-11-09 53 views
2

我有一个应用程序,有一个viewpager与4片段。我想用我的服务器中的数据填充所有片段。我在活动中加载数据,我想将它分发到所有片段。反应改造电话

所以我有这样的签名:

@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([email protected], "Erro ao carregar informações", 
           Toast.LENGTH_SHORT).show() 
         e.printStackTrace() 
        } 

        override fun onNext(trashCanList: List<TrashCan>) { 
         mTrashCanList = trashCanList 
        } 
       }) 

然后,我有一个方法,从该名单中获得可观察:

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 
     } 

嗯...这应该工作,但它没有。发生的情况是,我的第一个碎片变空了,而第四个碎片有空。 (第二和第三不应该有任何的数据......和他们不这样做)

所以我认为:当片段被创建,列表仍然是空的,所以在活动中可观察到有没有提供...但是当视图寻呼机进入第四个片段时,List不再为空,因此我的屏幕显示了数据。

我的问题是:如何使可观测的活动保持数据推入片段?现在,它仅在Observable被下标时才会推送数据...我想改变它,所以当有新数据时它会推送。

(我认为第一个可观测应与主题直接comunicate,位我不知道该怎么做......)

任何帮助表示赞赏!

+0

'BehaviorSubject.from(mTrashCanList)' - 它只需要列表的当前值。它不会对列表更新做出反应。 –

+0

感谢您的快速响应。这是我的问题的关键点......我不知道如何使它对更新作出反应 –

回答

1

你的问题是,这种操作只需要在列表的电流值,不上的更新反应(又何必呢?):

BehaviorSubject.from(mTrashCanList) 

为一体,在您的活动选项,您可以订阅你的BehaviorSubjectObservable

ServiceGenerator.createService(ApiClient::class.java) 
      .getTrashCans() 
      .subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(yourSubject) 

然后返回它,而不是你的主题:

override fun getObservable(): Observable<TrashCan> { 
    return yourSubject.asObservable() 
} 
+0

这看起来非常好!我不知道share()方法。我今晚会试一试,并让你知道 –

+0

我刚刚试过这段代码。这仍然不是我正在寻找的...每当切换视图寻呼机中的碎片时,它们都会再次触碰服务器。我希望它只打一次,或者当我按下一个按钮时,对新值作出反应。 现在它每次只能在服务器上下载时触发​​服务器......我的目标是获取Retrofit返回的最后一个值,而不是再次使用Retrofit。 我相信我需要一个主题这个...但不知道女巫一 –

+0

@LeandroBorgesFerreira尝试更新的答案 –