17 Temmuz 2014 Perşembe

Android Eventbus(Otto) Kullanımı


Geliştirme yaparken yazdığınız sınıfların bağımlılıklarının düşük olması önemli bir kriter, bu sayede kurduğunuz yapı kolay genişletilebilir, test edilebilir ve yeniden kullanımı kolay bir hal alır. Sınıflar arasında  bağımlık genelde interface'ler kullanılarak düşük tutulur. Ancak bu yaklaşımın olumsuz yanı callback'ler vs.'den kaynaklanan boilerplate code. Fakat biz publisher-subscriber(observer) mekanizmasını kullanarak hem gevşek bağlı(loose coupling) birimler oluşturup hem de boilerplate code problemini kotarabiliriz. Bu noktada piyasadaki eventbus kütüphanelerinden faydalanabilirz.

Android tarafında temiz, sağlam, açık kaynaklı kütüphanelerin adresi Square'in eventbus için de güzel bir çözümü mevcut: Otto. Bu kütüphane, Google'ın Guava kütüphanesinin eventbus modülünden fork'lanıp, android için optimize edilerek geliştirilmiş. Otto'yu kullanarak android komponentleri arasında(Activity, Service, Fragment vs) loosly coupled şekilde iletişim kurabiliriz. Otto'nun kullanımı çok basit, adımlarla açıklarsak:

1. Bus Tipinin Nesnesini Oluşturmak

Bus sınıfı bu iletişim ağının kalbini oluşturan parça. Otto Bus tipinin default yapıcı metodu iletişimin main thread üzerinden olacağını varsayarak nesne oluşturuyor. ThreadEnforcer tipini parametre olarak alan overload ile iletişim background thread'ler üzerinden sürdürülebilir. Background thread'den üretilen mesajın handle edilmesi sırasında ui elemanlarına vs kontrollü erişmeniz gerek. Bus instance'ının singleton olması gibi bir zorunluluk dayatmamış kütüphane, benim tavsiyem android uygulamanızın Application sınıfı veya helper bir sınıf altında main thread üzerinden iletişim kuran, singleton bir bus instance'ı:
public static Bus bus = new Bus(ThreadEnforcer.ANY);

2. İlgili Tipleri Bus'a Kayıt Etmek
İletişim kuracak olan komponentlerin mesaj yayınlabilmesi ve alabilmesi için öncellikle bus'a kayıt olması gerekli, örneğin Acitiviy sınıfının onCreate metodu bu işlem için uygun:
public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // sisteme kayıt olma, App:Aplication sınıfı
        App.bus.register(this);
    }

}

3. Bus Üzerinden Mesaj Yayınlamak:
Sisteme kayıt olduktan sonra takipciler(subsriber) ile iletişim kurmak icin bus ile olay(event) yayınlanır. Kendi tanımladığımız poco tipleri bu iş için kullanabiliriz:
// event'i temsil eden sinif
public class MessageEvent {
    public String message;

    public MessageEvent(String message) {
        this.message = message;
    }
}

// bus'a kayit olan sinif icerisinde olay yayınlama
App.bus.post(new MessageEvent("mayday mayday!));

4. Belirli Olayları Dinlemek Ve Handle Etmek
Bir olayı dinlemek bir metot oluşturup onu @subscribe ile işaretlemekten ibaret, yazının başında belirtiğim interface mekanizmasında bu aşamada pekala soyut tipi örnekleyip callback oluşturacak, boilerplate code oluşumuna sebebiyet verecektik:
    // MessageEvent tipinden olayları dinliyoruz
    @Subscribe
    public void messageReceived(MessageEvent event){
       // mesaji handle et
    }

5. Bus'tan Ayrılmak
Bir activity sınıfı için onDestroy bu işlem için genellikle en uygun yer, bus'tan unregister olarak sistem yükünü hafifletiyoruz:
public class MainActivity extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // sisteme dahil olma
        App.bus.register(this);
    }
    
    // ..

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // sistemden çıkma
        App.bus.unregister(this);
    }
    
}

Otto'yu kullanarak oluşturduğum android projesine buradan ulaşabilirsiniz, ekran görüntüsü alttaki gibi;


Umarım faydalı bir yazı olmuştur, bol android'li günler, hayırlı ramazanlar.

4 yorum: