2015-07-08 13 views
6

Birkaç hafta önce şu soruyu sordum: recyclerview periodic ui child updates.İçinde RxJava'yı Kullanma RecyclerView Adaptörü

Ve bugün Rxjava'yı kullanarak bu eğlencelilığı yeniden tanımlamak istiyorum. I şu şekilde aslında oldukça basit başarmak oluyor:

@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(); 
     } 
    } 

sorun ancak farklıdır. Değiştirildiğinde Duraklatılan ve Yok Olmayan Etkinlikler ile uygulanan bir navigationDrawer var. Bu nedenle, bu bağdaştırıcıyı içermeyen etkinliğe geçtikten sonra, gözlemlenebilir şeyler göndermeye devam ediyor çünkü periyodik bir aralık Gözlemlenebilir. Yani sorum şu, ne yapmalıyım? Etkinlik duraklatıldığında aboneliği iptal etmem gerekiyor, ancak ne zamandan beri ve nasıl geri abone olacağımı bilmiyorum. Herhangi bir yardım ya da fikir? nasıl anda görüntülenen/bağlıdırlar tüm ViewHolder s başvurular alırım, bir RecyclerView içeren bir Activity: Yanlış anlamadıysam

+0

Ya da sadece bir oturum açma yapmalıyım ve etkinlik duraklatılmışsa hiçbir şey yapmamalı mıyım? –

cevap

1

Yani, sorunu çözmek için tek yön soruyu cevaplamak için mi?

// 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(); 
} 

Ve aynı şekilde, kendi Activity arasında onResume görevleri yeniden olabilir:

Örneğin, sonra senin Activity arasında onPause() aşağıdaki yapabileceği tüm güncellemeleri durdurmayı.

ANCAK: Şimdi bu zaten bağlanmıştır (örneğin ilk önce veya son görünür öğeden sonra) RecyclerView görünür alanının ötesinde ViewHolder ler olabilir emin değilim ama bu olmaz yazdığı Bu yöntemle ulaşılabilir. Bu durumda, adaptörünüzdeki öğelerin tüm indeksleri üzerinde yineleme yapabilir ve yalnızca null geri dönüş değerlerini atabilirsiniz.

+0

Ben çözüm kendi çözüm önerdi sorun çözülmüş, kendisi tarafından çözüm buldum. Bağdaştırıcıda bir CompositeSubscription oluşturun, aboneliği, comppowerSubscriptionObject bağdaştırıcısını temizlediğiniz reapeatingTaskMethod, onActivityPause call adapter.removeSubscriptions içinde ekleyin. Görevin başlaması önemli değil çünkü etkinlik bir kez yeniden başladıktan sonra, tüm zamanlayıcılar yeniden başlayacaktır, böylece tüm zamanlayıcılar tekrar başlayacaktır –

+0

, çünkü zamanlayıcı aslında bir timeStamp gerçek zamanlı bir zamanlayıcı değil –

+0

değil, aynı zamanda cevabınız da çalışır. Kabul edeceğim –