9 Nisan 2015 Perşembe

Android AsyncTask

Genel Bilgiler

http://developer.android.com/reference/android/os/AsyncTask.html
android.os paketi içerisinde bulunuyor.

UI threadi meşgul etmemesi açısından uzun zaman alacak işlemlerin kontrolünü AsyncTask sınıfından kalıtımla yarattığımız asenkron sınıflara teslim etmemiz gerekiyor.
Eğer böyle yapılmazsa arayüzün işlem bitene kadar kilitlenmesine/donmasına yol açıyor ki bu kullanıcının tamamen uygulamadan dışlanması demek oluyor.
Zaten bu şekilde yapıldığında Eclipse yada Android Studio hemen hata vererek bizi uyarıyor.

(Java Swing'de de aynı mantıkla hareket ediliyor.
Aksi halde swing formu işlem bitene kadar donup kalır.
Yalnız swing'de bu şekilde bir uyarı almıyoruz.)

Örnek kullanım


private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

Bu sınıfı kullanmak için de:

new DownloadFilesTask().execute(url1, url2, url3);

Execute metodu


Asenkron sınıftan aldığımız instance'ı çalıştırmak için execute() metodunu çağırıyoruz.
Execute içerisinde bir ya da daha fazla parametre verebiliyoruz.
Yalnız bu parametrelerin tiplerinin aynı olması gerekiyor.
doInBackground() metodu bunların hepsini bir array halinde parametre olarak alabiliyor.

Parametreler


AsyncTask sınıfının parametreleri <Params, Progress, Result> olması içerideki metodların girdi-çıktısının kontrollü ve net bir şekilde belirtilmesini sağlıyor.
Bunları tek tek inceleyelim:

Params : execute metodunda verdiğimiz ve doInBackground() metodunun parametre olarak aldığı değer ya da değerlerin tipi.
Progress : doInBackground() metodunun döndürdüğü ve onProgressUpdate() metodunun parametre olarak aldığı değerin tipi.
Result : onProgressUpdate() metodunun döndürdüğü ve onPostExecute() metodunun parametre olarak aldığı değerin tipi.

Hiç yorum yok:

Yorum Gönder