Temel Rxjava (1)

Gürkan Kesgin
KoçSistem
Published in
2 min readOct 15, 2017

RxJava Nedir ?

RxJava , yani Reactive Extension Java yani asenkron + fonksiyonel. En temelde observable pattern üzerine kurulu asenkron işlemler için kullanılan güçlü bir kütüphanedir . Kendi içinde 3 parçaya ayrılır .

Observable (Gözlenen) — Observer (Gözlemci) — Datayı işleyen metodlar

Observable = Verinin yayınlandığı yer
Observer = Verinin dinlendiği yer
Veriyi İşleme =Veri üzerinde filtreleme , ekleme , çıkarma vs.. işlemlerin yapıldığı yer

Observable
.just(" Hello World ")
.map(new Function() {
@Override
public String apply(String s) throws Exception {
return s.trim();
}
})
.subscribe(new Consumer() {
@Override
public void accept(String s) throws Exception {
Log.d("", s);
}
});
Ekran Çıktısı : HelloWorld

Yukarıdaki örnekte en basit haliyle bir örnek görebilirisiniz . “Hello World” yayınlanıyor -> trim() ile filtreleniyor -> subscribe edilen yerde sonuç görüntüleniyor .

Neden RxJava Kullanmalıyım ?

Yukarıdaki örnekte bir string yayınlanmış onu da bir yerden dinlemiş basmışsın , bunun için mi yani bu rxjava diyebilirsiniz :) haklısınız . Peki ama neden neden kullanmalıyım diye sorarsanız !

(Java)

new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
final List strings = new ArrayList<>();
strings.add("Hello");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, strings.toString(), Toast.LENGTH_SHORT).show();
}
});
}
}).start();

Yapmak istediğim çok basit , bana bir liste dönecek olan bir işlem -sqlite ile çektiğimi düşünün- ama 500 milisaniyelik bir gecikme ile cevap veriyor .-Örnek amaçlı Thread.sleep(500) ile bir gecikme ekledim -. Ardından sonucu ekrana basacağınızı, bu işlem sırasında da ekranda bir progress döndüğünü düşünün.

Progressin takılmaması için mainthread in kitlenmemesi gerekiyor haliyle yeni bir threadde çalışsın dedik . Sonucun ise ekrana basılması , ekrandaki progressin gizlenmesi gibi UI işlemler yapılması için UI thread e geçmeniz yani bir runOnUiThread başlatmanız gerekiyor.

Bunun yerine

(RxJava)

Observable
.fromCallable(new Callable>() {
@Override
public List call() throws Exception {
Thread.sleep(500); List strings = new ArrayList<>();
strings.add("Hello");
return strings;
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer>() {
@Override
public void accept(List strings) throws Exception {
Toast.makeText(MainActivity.this, strings.toString(), Toast.LENGTH_SHORT).show();
}
});

ObserveOn = Subsriber hangi thread’de dinlemesi gerektiğini belirtiyoruz . -AndroidSchedulers.mainThread() yani main threadde dinle çünkü Toast ile ekrana sonucu basacak -. Sonucu alıp UI giydirmesi yapacaksanız da yine aynı şekilde AndroidSchedulers.mainThread() kullanmalısınız .
SubscribeOn = Observable sonucu yayınlanacak olacak işlemin hangi threadde çalışması gerektiğini belirtiyoruz . -Ben newThread() kullandım “yani yeni thread aç” ama Schedulers.io da aynı işi yapıyor sadece Schedulers.io var olan ama boşa çıkmış threadlerden birini kullanıyor .

Bunların yanında RxJava’nın sağladığı data üzerinde yapacağınız işlemleri oldukça basite indirgeyen çok güçlü bir method set (Operators) olduğunu hesaba katarsak . RxJava geleneksel java koduna göre daha baskın geliyor .

Yazının devamına linkten erişebilirsiniz.

--

--