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.
Mükemmel bir anlatım.
YanıtlaSilteşekkürler :]
Silelin sağlık gökhan abi
YanıtlaSilteskkurler
Sil