Android

Android Asenkron Programlamada Geri Bildirim Olayları, AsyncTask Event Kullanımı

Android’de, kodu eşzamansız (yani UiThread’e paralel olarak) yürütmenin pek çok yolu vardır. AsyncTask sınıfı kullanmak, programcı için mekanizması en kolay olanıdır ve nispeten az miktarda kurulum ve kod gerektirir.

Yeni geliştiriciler AsyncTask’ı kullanımında aşağıdaki gibi bir yöntemi uyguluyor olabilirler;

Dikkat edilirse Activity sınıfının içerisinde yazılmış bir AsyncTask sınıfı mevcut. Bu tip bir yaklaşımın en temel nedeni, asenkron yürütülen iş esnasında UI (kullanıcı arayüzü) tarafında bulunan kontrollere değer gönderme çabasında olunmasıdır. Ancak bu yaklaşım şekli aşağıdaki sorunlarla karşılaşmanızı muhtemel kılacaktır.

  1. direkt ya da sıkı sıkıya bağlı kod bileşenleri
  2. bağlı olunacak yapılara/yapılardan teker teker kayıt olmak/kaydı silmek
  3. kod tekrarı
  4. testin zorlaşması
  5. hata çıkma ihtimalinin artması

Doğru kullanım açısından değerlendirecek olursak, Nesneye Yönelik Programlamanın temel ilkelerinden Esnek Bağ Tasarım Prensibi (Loose Coupling), göz önüne alınmalıdır. Böylece AsyncTask sınıfının Activity ile olan sıkı bağımlılığını nasıl kontrol altında tutabileceğimiz konusunu çözebiliriz. Sonuçta tasarlanmış olan bir sistemimiz var ve içerisinde ise değişimini izlemek istediğimiz bir sınıf mevcut. Activity ile AsyncTask sınıflarımızı birbirinden ayırmak ve en önemlisi iki sınıf arası iletişimin bir de arayüz üzerinden referansları aracılığı ile sağlanması, sınıflar arası izolasyonun da sağlanması açısından iyi bir yol olacaktır.

Bu yazıda AsyncTask’ın diğer etkinlikler için aynı zamanda tekrar kullanılabilir olmasını sağlamak için nasıl tek bir sınıf olarak oluşturulabileceğini anlatacağım . AsyncTask , ana parçayı (kullanıcı arabirimi) engellemeden web’den veya sunucudan veri indirme gibi belirli bir görevi yürütmenize olanak tanır. Şimdi, Nesne Tabanlı Programlama kavramlarının ve mekanizmalarının, yeniden kullanılabilir bir kod yazmak için yararlarından faydalanmalıyız elbette.  Burada yapacağımız şey, tek bir AsyncTask oluşturup onu ayrı bir sınıfa koymak ve istediğimiz Activity içinde kullanmaktır. Temel sorun, AsyncTask işleminin sonucunun ele alınması ile birlikte gelir . AsyncTask sınıfının özel sınıfa nasıl genişletilebileceğine bir göz atalım ve arka planda yapılması gereken işlemlere ait sonuçların nasıl UI tarafına geçireleceğine bir bakalım.

Şimdi bu mimariyi bir Activity ile AsyncTask görevi arasında nasıl kullanacağımızı belirleyelim;

Her iki sınıf arası iletişimi kurmak için işe basit bir interface (arayüz) tasarımı ile başlayalım; Tasarlayacağımız Interface, AsyncTask sınıfının geri bildirim metodlarını referans alacaktır. Interface tasarımında bulunan <T> tipi sayesinde sınıflar arası iletilecek verinin tip bağımsızlığını sağlamaktadır. İstenilirse belileyeceğiniz tiplere göre düzenleme yapabilirsiniz.

ITaskEventListener.java

Arkaplan işleminizi yapacak MyAsyncTask sınıfını aşağıdaki şekilde düzenleyin.

MyAsyncTask.java

Yukarıda bulunan MyTaskAsync sınıfımızda ITaskEventListener interface sınıfına ait bir referans tutucunun bulunması dikkat etmemiz gereken noktadır.  Kurucu metoda (constructor) parametre olarak gelen context nesnesi ile, eş zamansız sınıfımızı çağıran Activity’nin referansının alınmasını sağlayacaktır.  Bu context nesnesinin ITaskEventListener tipine dönüştürülmesi, ilgili Activity’nin ITaskEventListener arayüzünden kalıtılmış (implements) olmasından dolayıdır ki her iki sınıf arası iletişim işte bu taşıyıcı referans üzerinden gerçekleşecektir.

Öncelikle örnek uygulamamızın arayüzünü arkaplanda çalışan iş parçacığının durumunu gösterecek şekilde dizayn edelim.

MainActivity.xml

MainActivity.java

Activity sınıfında dikkat edilmesi gereken “ITaskEventListener” interface ‘den kalıtılmalıdır.

Örneğimizi test ettiğimizde çalışmasını sorunsuz olarak izleyebilirsiniz.

Yukarıdaki örneğimizin kaynak kodlarını indirebilirsiniz. AsyncTaskCallBackSample

 

Yorum Yap