2015-07-08 13 views
6

So vor ein paar Wochen habe ich diese Frage gestellt: recyclerview periodic ui child updates.Verwenden von RxJava in RecyclerView Adapter

Und heute möchte ich diese Funktionalität mit Rxjava umgestalten. Es ist eigentlich ziemlich einfach, ich beende den folgenden Weg:

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

       if (friend.getGameStatus().equals(GameStatus.INGAME)) { 
        holderOnline.startRepeatingTask(); 
       } else { 
        holderOnline.stopRepeatingTask(); 
       } 
    } 


class MyViewHolderOnline extends RecyclerView.ViewHolder { 

    private Subscription subscribe; 

     public MyViewHolderOnline(View itemView) { 
      super(itemView); 
      ButterKnife.bind(this, itemView); 

     } 

     public void startRepeatingTask() { 
      subscribe = Observable.interval(updateInterval, TimeUnit.MILLISECONDS) 
        .map(aLong -> current.getGameStatusToPrint()) 
        .subscribeOn(Schedulers.io()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Subscriber<String>() { 
         @Override public void onCompleted() { } 
         @Override public void onError(Throwable e) { } 

         @Override 
         public void onNext(String gameStatusToPrint) { 
          gameStatus.setText(gameStatusToPrint); 
         } 
        }); 
     } 

     void stopRepeatingTask() { 
      if(subscribe != null && !subscribe.isUnsubscribed()) 
       subscribe.unsubscribe(); 
     } 
    } 

Das Problem ist jedoch anders. Ich habe einen navigationDrawer implementiert mit Aktivitäten, die pausiert sind und nicht zerstört werden, wenn sie geschaltet werden. Nachdem ich also zu der Aktivität gewechselt habe, die diesen Adapter nicht enthält, sendet das Observable weiterhin Daten, weil es ein periodisches Intervall Observable ist. Also meine Frage ist, was soll ich tun? Ich muss mich abmelden, wenn die Aktivität pausiert ist, aber ich habe keine Ahnung, wie seit, und auch, wie man sich zurückmeldet. Irgendwelche Hilfe oder Ideen? So

+0

oder sollte ich nur onNext überprüfen und nichts tun, wenn die Aktivität pausiert ist? –

Antwort

1

, wenn ich Sie richtig verstanden habe, ein Weg, um Ihr Problem zu lösen, ist die Frage zu beantworten: In einem Activity, die ein RecyclerView enthält, wie bekomme ich Verweise auf alle ViewHolder s, die aktuell angezeigt werden/gebunden?

Zum Beispiel alle Updates stoppen Sie dann den folgenden in der onPause() Ihrer Activity tun könnte:

// assuming you are using a LinearLayoutManager: 
final int firstVisibleIndex = mLinearLayoutManager.findFirstVisibleItemPosition(); 
final int lastVisibleIndex = mLinearLayoutManager.findLastVisibleItemPosition(); 

for (int i = firstVisibleIndex; i <= lastVisibleIndex; i++) { 
    YourViewHolder viewHolder = (YourViewHolder) findViewHolderForAdapterPosition (i); 
    viewHolder.stopRepeatingTask(); 
} 

Und ebenso könnte man die Aufgaben in der onResume Ihrer Activity neu starten.

ABER: Nun, da ich dies schrieb mir nicht sicher bin, ob es ViewHolder s über den sichtbaren Bereich der RecyclerView sein kann (dh vor dem ersten oder nach dem letzten sichtbaren Elemente), die bereits gebunden ist, aber das wäre nicht mit dieser Methode erreicht werden. Wenn dies der Fall ist, können Sie immer noch über alle Indizes der Elemente in Ihrem Adapter iterieren und einfach alle null Rückgabewerte verwerfen.

+0

Ich habe die Lösung von sich selbst gefunden, alought dein Vorschlag Teil das Problem zu beheben. Erstellen Sie eine CompositeSubscription in dem Adapter, fügen Sie die Subskription in dem repeatingTaskMethod onActivityPause-Aufruf adapter.removeSubscriptions hinzu, in dem Sie den Adapter compositeSubscriptionObject löschen. Das Starten der Aufgabe ist unwichtig, denn sobald die Aktivität wieder aufgenommen wird, wird jede Ansicht neu gezeichnet, so dass alle Timer erneut gestartet werden –

+0

was funktioniert, weil der Timer tatsächlich ein timeStamp ist kein echter Timer –

+0

aber Ihre Antwort funktioniert auch so Ich werde es akzeptieren –

Verwandte Themen