2016-11-09 6 views
2

私は4つの断片を持つビューページを持つアプリを持っています。私はすべてのフラグメントに私のサーバーからのデータを入力したい。私はアクティビティでデータを読み込み、それをすべてのフラグメントに配布したいと思います。Reform to call

だから私は、このシグネチャがあります。

@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 
     } 

うーん...これは動作するはずですしかし、それはしません。私の断片の最初の部分は空になり、一方の断片にはデータがあることが起こります。 (2番目と3番目はデータを持っていないはずです...)

だから私はそう思います:フラグメントが作成されると、リストはまだ空ですので、アクティビティのObservableは何も提供しません...しかし、ビューページャーが4番目のフラグメントになったとき、Listはもうnullではないので、私の画面にデータが表示されます。

私の問題は次のとおりです。アクティビティでオブザーバブルを作成して、データをフラグメントに保存し続けるにはどうすればよいですか? Observableがサブスクリプションのときにデータをプッシュするだけです...これを変更したいので、新しいデータがあるときにプッシュします。

(私が最初に観察可能で、件名と直接私はそれを行う方法がわからないんだけど少しcomunicateすべきだと思う...)

すべてのヘルプは歓迎です!

+0

'BehaviorSubject.from(mTrashCanList)' - リストの現在の値を取ります。リストの更新には反応しません。 –

+0

本当に速い応答に感謝します。それは私の質問の要点です...私はそれがアップデートに反応する方法を知らない –

答えて

1

あなたの問題は、この操作は、単にリストの現在の値を取り、(なぜそれすべきか?)の更新に反応しないということです:あなたはあなたのBehaviorSubjectにを購読することができ、あなたの活動の一つの選択肢として、

BehaviorSubject.from(mTrashCanList) 

Observable:その後、

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を再度使用しないことです。 私はこれのための件名が必要だと信じています...しかし確かな魔女の1人です –

+0

@LeandroBorgesFerreira更新された答えを試してください –