Temel Rxjava (4)

Gürkan Kesgin
KoçSistem
Published in
1 min readMar 20, 2018

zip()

Bir sayfada iki tane servise çıktığınızı düşünün. Örnek profil sayfanızı güncellemek için profil fotoğrafı servisi farklı , ad soyad gibi text alanları için farklı servise çıktığınızı düşünün. Senaryo şu şekilde.

  • Güncelle butonuna basıldığı anda ekranda progress başlatılacak
  • İki farklı asenkron servis 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 zip() 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.

Not : 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
}
});

Katkıları için Jemshit Iskenderov’a teşekür ederim :).

--

--