Android için AsyncTask Sınıfı İncelemesi

By | 24 January 2016

Android uygulaması ayağa kaldırıldığında, sistem tarafından bir process(işlem) başlatılır ve uygulama bu işleme bağlı tek bir thread üzerinde yürütülür.Buna main thread veya UI(User Interface) Thread adı verilir.Ugulamanın bir arayüzü olsa da olmasa da bütün komponentler bu thread üzerinde çalıştırılacaktır.Yapacağımız herhangi bir veritabanı sorgulama veya network işleme, arayüzü bloke ederek kullanıcının işlem yapmasına engel olur. Ve sonunda ANR(Application Not Responding) mesajıyla kapatacaktır.Buna engel olmak için AsyncTask class’ı yardımımıza koşuyor.UI Thread’ı mümkün olduğunca meşgul etmememiz gerekiyor.Ancak burada dikkat etmemiz gereken konu arayüzü sadece ve sadece UI Thread üzerinde güncellemeliyiz.UI Thread dışında güncelleme yapmamız beklenmedik durumlarla karşılaşmamıza sebep olur.

    AsyncTask

Biraz önce bahsettiğim gibi zaman alacak işlemleri bir thread üzerinde, arkaplanda yapmamızı ve işlem devam ederken ya da tamamlandığında arayüz güncellememizi yapmamızı sağlayan bir yöntemdir. Bunu kullanmamızın güzel tarafı thread oluşturma/yönetme işlerinden bizi kurtarması ve aynı zamanda UI Thread üzerinde işlem yapmamıza olanak sağlamasıdır.Yeni bir AsyncTask oluşturmak için bu sınıftan türeyen yeni bir sınıf oluşturmalı ve bazı metotlarını override etmeliyiz. Örnek bir AsyncTask sınıfı aşşağıdaki yapıya sahiptir.

public class OrnekAsyncTask extends AsyncTask<Params, Progress, Result> {
    protected void onPreExecute(){
        ...
    }
    protected Result doInBackground(Params... params){
        return null;
    }
    protected void onProgressUpdate(Progress.... values){
        ...
    }
    protected void onPostExecute(Result result){
        ...
    }
}

 

 

OrnekAsyncTask sınıfında 4 farklı method olduğunu gördünüz.Her birisini tek tek inceleyelim.

onPreExecute()
UI Thread içerisinde yürütülür ve execute fonksiyonu çağırıldığında ilk olarak çalıştırılacak methodtur
Task çalıştırılmadan önce yapmamız gereken hazırlık işlemlerini burada yapabiliriz. Örneğin; bir işlem
yürütüldüğüne dair ProgressDialog gösterebiliriz.

doInBackground(Params… params)
onPreExecute methodundan sonra çağırılır. execute methodu verdiğimiz argüman ile çağırılacaktır.
Bu fonksiyonun içerisinde yapacaklarımız UI Thread içerisinde değil, oluşturulan yeni bir yardımcı
thread içerisinde çalıştırılır.Yani veritabanı sorgulama, network operasyonları gibi uzun sürecek
işlemleri burada yapabiliriz. UI Thread’te olmadığımız için bu methodta arayüz güncelleme işlemi
kesinlikle yapılmaz.Fonksiyon çalıştırıldıktan sonra AsyncTask tanımındaki Result tipinde sonuç döner.

onProgressUpdate(Progress… values)
UI Thread içerisinde yürütülür. doInBackground methodunun çalıştırılması uzun süreceğinden
kullanıcıya yüzde kaçının tamamlandığını gösterebiliriz. Bu durumda doInBackground
içerisinde publishProgress fonksiyonunu yüzde bilgisi ile çağırabiliriz. onProgressUpdate methodu da
UI Thread üzerinde çalıştırıldığı için yüzde bilgisini ekranda gösterebiliriz.

onPostExecute(Result result)
        UI Thread içerisinde yürütülür. doInBackground methodu tamamlandıktan sonra çağırılır.Parametre
olarak da bu methodun sonucunu yani Result alır. UI Thread içerisinde olduğu için rahat rahat
ProgressDialog penceresini burada kaptabiliriz veya diğer arayüz işlemlerini yapabiliriz.

     Sonuç

Görüldüğü gibi bu methotlardan sadece doInBackground yeni bir thread içerisinde çalıştırılırken
gerisi UI Thread üzerinde yürütülür.Bu da bize arka plan işlemlerimizi yerine getirirken, aynı zamanda
süreçle ilgili durumu UI Thread üzerinde rahat bir şekilde gösterebilmemizi sağlar. Şimdilik
anlatacaklarım bu kadar. Umarım faydalı olur. Bir daha ki yazımda görüşmek üzere… 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

*