Temel Rxjava (1)
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.