20 Mart 2018 Salı

Temel Rxjava (4)

zip()
Bir sayfada iki tane servise çıktığınız düşünün. Örnek profil güncelleme. Bunun içinde aynı anda iki tane servise çıkıyorsunuz. Profil fotoğrafı güncellemek için ayrı, ad soyad vs için ayrı. Senaryo şu şekilde.
  • Güncelle butonuna basıldığı anda ekranda progress başlatılacak
  • İki servis çağrılacak aynı anda çağrılacak
  • İkisinden de cevap geldiği anda progress kaldırılacak
Şimdi burda şöyle bir sıkıntı var. Hangi servisten önce cevap dönecek. Progressi kaldırmamız için ikisinden de cevap dönmüş olması lazım. Bunun için rxjava daki reduce() methodunu kullanabilirsiniz.
Observable.zip(

Observable.just("foto güncelleme 3 saniye")
.delay(3, TimeUnit.SECONDS).subscribeOn(Schedulers.newThread()),

Observable.just("diger servis 6 saniyelik gecikme")
.delay(6, TimeUnit.SECONDS).subscribeOn(Schedulers.newThread()),

(o1, o2) -> new Object())
        
.doOnSubscribe(disposable -> 
startTime = System.currentTimeMillis())
        
.doOnComplete(() -> {
            
long totalDuration = System.currentTimeMillis() - startTime;
Log.d("Result","Total : " + totalDuration + "ms");
        })
.subscribe();
D/Result: Total : 6003ms
Aynı anda çağırılan iki servis için de yeni thread açıldığı için aynı anda başlamıştır. doOnComplete ise ikinci servisten cevap geldiğinde çağrılmıştır. Yeni thread açmazsanız senkron olarak işletilir.
debounce()
Bir şeyler search edeceğiniz zaman genelde siz yazdıktan sonra biraz zaman geçer ”200ms–300ms” sonra tetiklenme olur.- Her harf için işlem yapılmasın da, tam olarak ne istediğini yazsın ondan sonra bir arama gerçekleşsin.-
Klasik yöntem textchangelistener içinde bir timer başlatılır. Her girilen yeni karakter için timer sıfırlanır , yeniden başlatılır. Bende bu şekilde yazıyorum hala . Ama debounce ile bu nasıl yapılır bir de ona bakalım.
RxTextView.textChanges(editTextVariableName)
        .debounce(500, TimeUnit.MILLISECONDS)
        .subscribe(new Action1<String>() {
            @Override
            public void call(String value) {
               // 500 ms sonra tetiklenecek değer
            }
        });

0 yorum:

Yorum Gönder