Perşembe , 23 Kasım 2017
Anasayfa » Android » Android Arka Plan İşleme, Zaman Uyumsuz (Asenkron) Programlama, AsyncTask Kullanımı

Android Arka Plan İşleme, Zaman Uyumsuz (Asenkron) Programlama, AsyncTask Kullanımı

Bu yazımız Android ile gerçekleştirdiğimiz yazılımlarımızda eş zamansız veya zaman uyumsuz (asenkron) olarak nitelendirdiğimiz iş parçacıklarının, ana programınız üzerinde nasıl ele alınması gerektiğine dair olacaktır.

Asenkron Programlamanın nedeni nedir?

Varsayılan olarak, bir uygulama kodu tek bir iş parçacığında (main thread) çalışır. Android bu iş parçasındaki tüm olayları bir sıra içinde toplar ve her bildiriyi sırayla yürütür. Uzun süren bir işlem gerçekleştirirseniz, ilgili işlem tamamlanıncaya kadar uygulama engellenir. Android platformunda Bir uygulama etkinliği , 5 saniye içinde tepki vermezse, Android sistemi Uygulama yanıt vermiyor (ANR) iletişim kutusu görüntüler. Kullanıcı deneyimleri bize Bu diyalogdan kullanıcı uygulamayı durdurmayı seçebileceğini göstermiştir.

İyi bir kullanıcı deneyimi sağlamak için, bir Android uygulamasındaki tüm potansiyel olarak yavaş çalışan işlemler zaman uyumsuz olarak çalışmalıdır! Bu, Java dili veya Android çerçevesinin eş zamanlılık yapılarıyla ancak düzenlenebilir. İşte tam burada asenkron programa devreye girmektedir. Başlatıldıktan sonra, ne kadar bir zaman süre sonucunu alacağını bilmediğimiz işlemler, her zaman ana iş parçasından bağımsız olarak ayrı bir iş parçacığı üzerinde yürütülmelidir. Buna asenkron programlama denmektedir. Potansiyel olarak yavaş işlemlerden kastımız, örneğin ağ işlemleri, dosyalama işlemleri, veritabanı erişim süreçleri veya uzun zaman alabilecek karmaşık hesaplamalar görülebilir.

Uzun süren bir işlem yapıyorsanız, çalışmakta olan işlem hakkında kullanıcıya geribildirim vermek her zaman iyi bir yoldur. Burada iki seçeneğiniz var. İlki bir Eylem çubuğu (ProgressBar) aracılığıyla ilerleme hakkında geri bildirimi sağlayabilirsiniz . Bir  ProgressBar’ı görünür olarak ayarlar ve uzun süren bir işlem sırasında onu güncelleyebilirsiniz. Bir diğer yol ise Engellemeyen geribildirimleri tercih edebilirsiniz. Böylece kullanıcı uygulama ile etkileşime devam edebilir. Geribildirim geldiğinde uygulama arayüzü güncellenebilir. Burada genel tercihinizi ikincisinden yana yapmak, kullanıcı arayüzünün (UI) her zaman  cevap verebilen (responsive) şekilde olmasına olanak sağlar.

Android ile basit bir asenkron iş parçacıcığını tanıyalım;

Asenkron iş parçalarını yürütebileceğimiz bir kaç farklı yöntem vardır. Bunların ilki java.lang kütüphanesi ile gelen ve Java dilinden de bileceğimiz. Runnable sınıfını kullanmaktır.

Aşağıdaki örneğimizde 10 kez tekrar eden 2 sn bekleme süreli bir iş Runnable sınıfı kullanılarak arkaplanda işletilen bir iş parçacığı şeklinde programlanmıştır.

activity_main.xml

MainActivity.java

Runnable sınıfına ait Run() metodu içerisinde bildireceğiniz kod, ana iş parçacığından bağımsız olarak Thread sınıfının .start() metodu ile işletilecektir. Ancak karmaşık alt düzey yapısı, iş parçacıkları arasında oluşan veri transfer sorunları, çok fazla açılabilecek iş parçacıklarının performansa dayalı problemleri ve tabiki yaşam döngülerinin kontrol zorlukları gibi dezavantajları göz önüne alınmalıdır.

Yukarıdaki örnegimizin kaynak kodlarını RunnableThreadSample linkinden indirebilirsiniz.

AsyncTask Sınıfı

Eşzamansız bir görev, bir arka plan iş parçacığında çalışan ve sonuç UI iş parçacığında yayınlanan bir hesaplama ile tanımlanır. Bu bağlamda AsyncTask sınıfı UI iş parçacığının doğru ve kolay kullanımını sağlar. Bu sınıf, iş parçacıklarını ve / veya işleyicileri değiştirmek zorunda kalmadan arka plan işlemlerini gerçekleştirmenize ve sonuçları kullanıcı arabirimi dizininde yayınlamanıza izin verir.

AsyncTask, Thread sınıfına yardımcı sınıf olarak tasarlanmıştır ve genel bir iş parçacığı çerçevesi oluşturmaz. AsyncTask’ler ideal olarak kısa işlemler için kullanılmalıdır (en fazla birkaç saniye.) İş parçacıkları uzun süre çalışmaya devam etmeniz gerekiyorsa java.util.concurrent paketinde sağlanan çeşitli API’leri kullanmanız şiddetle önerilir. Executor, ThreadPoolExecutor ve FutureTask gibi sınıfları inceleyebilirsiniz.

AsyncTask sınıf yapısında Params Progress ve Result adı verilen 3 genel tür ve onPreExecute() , doInBackground() , onProgressUpdate() ve onPostExecute() adındaki 4 metod ile birlikte gelmektedir.

AsyncTask sınıfını abstract bir sınıftır. Kullanabilmek için öncelikle kendi özel sınıfınıza extend deyimi ile bildirmelisiniz.

Bu metodlardan yalnızca doInBackground metodu bulunması zorunludur ve arka planda gerçekleştirilecek bütün işlemler bu metod içerisinde ele alınır. İsteğe bağlı olarak diğer metodları kullanabilirsiniz. Şimdi bu metodların kullanım amaçlarına bir göz atalım.

  • onPreExecute – Görev yürütülmeden önce UI iş parçacığında çağrılan metottur. Arka plan işlemi başlamadan önce ekranda değiştirilmesi istenen veya kullanıcıyı bilgilendirme amaçlı çıkan(lütfen bekleyin, yükleniyor, ayarlar yapılıyor gibi)  ve gerekli değişkenlerin değer atamasının yapıldığı yerdir.
  • donInBackground – Arka planda yapılması istenen bütün işlemler bu metot içerisinde gerçekleştirilmelidir. Burada gerçekleşen işlemler kullanıcının uygulamayı kullanmasını engellemez. Burada ki işlemler sonucunda MainThread’e (ana akış) bir değer gönderilmesi gerekiyorsa “return” ile bu değişken onPostExecute() metoduna gönderilir.
  • onPostExecute – doInBackground() üzerinde ele alınan arka plan işleminiz tamamlandıktan sonra sonuç bu metoda gelecektir. Burada yapılan işlemler ana akışı etkiler ancak özel bir hataya neden olmaz. Arka planda gerçekleşmiş bir işlemden gelen veri bu metot vasıtasıyla uygulama arayüzünde gösterime sunulabilir.
  • onProgressUpdate – doInBackground metodu içinde bulunan işlemin durumu bu metot vasıtasıyla yayınlanır. Örneğin dosya indirime yüzdesi gibi bir bilgiyi UI tarafında bu metod vasıtasıyla işleyebilirsiniz.
  • onCancelled – AsyncTask üzerinde bulunan işlem iptal edilirse bu metot tetiklenir.

AsyncTask<Tür1,Tür2,Tür3> şeklinde görmüş olduğunuz yapıyı tanıyalım. Burada Tür1 doInBackground() metoduna dışarıdan gelmesini isteyebileceğiniz parametrelere türüdür. Herhangi özel bir tür vermek istememeniz halinde (örnekte olduğu gibi) void kullanılmalıdır. Tür2 doInBackground() metodunun işleyişi sırasında onProgressUpdate() metoduna gönderilecek nesnenin türündür. Tür3 ise onPostExecute() metodu için doInBackground() metodunun return ile gönderilecek nesnenin türüdür. Buradaki türleri istediğiniz gibi değiştirebilir, bir değişken tipi (int, bool, long) olabileceği gibi bir sınıf türü de olabilir.

AsyncTask’lar, içerisinde çalıştıkları Activity herhangi bir sebepten dolayı sonlanmayabilir veya görev ölebilir (deadLine) Bu yüzden uygulama içerisinde kısa süreli işlemler ya da Activity yaşadığı sürece gerçekleşmesi beklenen işlemler için kullanılmaları tavsiye edilir.

Arka Planda çalışmasını istediğimiz çağırabilmek için yapısında tutan ve AyncTask sınıfından extend ile kalıttığımız sınıftan bir örnekleme yapılıp .execute() metodunu tetiklememiz yeterli olacaktır. Görev çağırımı uygulamanızın ana iş parçacığından yapılmalıdır. Örneğin Activity üzerinden olabilir.

Aşağıdaki örneğimizde 10 kez tekrar eden 2 sn bekleme süreli bir iş AsyncTask sınıfı kullanılarak arka planda asenkron olarak işletilen bir iş parçacığı şeklinde programlanmıştır. Amacımız AsyncTask sınıfının nasıl kullanılacağını göstermektedir.

Activity.xml

MainActivity.Java

AsynTask kullanımında, parametrelere vereceğiniz türlere ve metodları görevlerine göre kullanmaya dikkat ediniz.

Uygulamayı test ettiğinizde AsyncTask sınıfını arka planda işletilirken metodları vasıtasıyla UI tarafına mesajlarını gönderdiğini görebilirsiniz.

Yukarıdaki örnek uygulamanın kaynak kodlarını AsyncTaskSample linkinden indirebilirsiniz.

Hakkında Recep ORTAKÖYLÜ

İlginizi Çekebilir

Android ListView Tıklanma Olayı

Merhaba arkadaşlar önceki yazımızda anlattığımız listView’in tıklanma olayını bu yazımızda göreceğiz.   Önceki yazımızda  listView …

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir