Android AsyncTask JAVA

Android AsyncTask birden fazla işlemin birbirine paralel çalışması ve arkaplan işlemleri







Bazen android uygulamalarında ana ekranımızda işlemler devam ederken arka planda, kullanıcının işlemlerini aksatmadan devam ettirecek bir yapı gerekir. İşte burada AsyncTask devreye giriyor. AsyncTask sınıfı abstract bir sınıf olduğundan dolayı başka bir sınıf üzerinden extends edilmesi gerekir. 


AsyncTask sınıflarında doInBackground metodu bulunması zorunludur ve arka planda gerçekleştirilecek bütün işlemler bu metod içerisinde yazılır.

onPreExecute – 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 metod içerisinde gerçekleşir. 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 işlemleri tamamlandıktan sonra işlemlerin sonucu bu metoda gelir. Burada yapılan işlemler ana akışı etkiler ve herhangi bir hataya neden olmaz. Arka planda gerçekleşmiş bir işlemden gelen veri bu metod vasıtasıyla uygulamada gösterime sunulabilir.
onProgressUpdate – doInBackground metodu içinde yapmış olduğunuz işlemlerin durumunu (örneğin dosya indirime yüzdesi) kullanıcıya göstermek isterseniz bu metodu kullanmanız gerekmektedir.
onCancelled – Herhangi bir sebepten dolayı AsyncTask iptal edilirse bu metod tetiklenir.


public class ArkaplanIslem extends AsyncTask<Void, Void, Void> {

      @Override
      protected void onPreExecute() {
         super.onPreExecute();
      }

      @Override
      protected Void doInBackground(Void... params) {
         return null;
      }

      @Override
      protected void onPostExecute(Void result) {
         super.onPostExecute(result);
      }

      @Override
      protected void onProgressUpdate(Void... values) {
         super.onProgressUpdate(values);
      }

      @Override
      protected void onCancelled(Void result) {
         super.onCancelled(result);
      }

   }

AsyncTask<Tip1,Tip2,Tip3> şeklinde görmüş olduğunuz yapıya değinelim. Burada Tip1 doInBackground metoduna verilecek parametrelerin tipini ya da sınıfını belirler (örnekte Void). Tip2 doInBackground metodunun işleyişi sırasında onProgressUpdate metoduna paslanacak değişkenin tipini ya da sınıfını belirtir. Tip3 ise onPostExecute metoduna verilen değişkendir ve aynı zamanda doInBackground metodunun return tipidir. Buradaki tipleri istediğiniz gibi değiştirebilirsiniz.

Son olarak değinmek istediğim şey ise AsyncTask’lar, içerisinde çalıştıkları Activity herhangi bir sebepten dolayı ölürse yaptıkları işlemler sonuçlanmayabilir. Bu yüzden Android SDK 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. Çok uzun süreli arka plan işlemleri (örneğin veritabanı güncelleme, dosya indirme) için Service sınıflarının kullanılması tavsiye edilir.


//Örnek Kod


public class MainActivity extends ActionBarActivity {


    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Thread thread = new Thread() {
            @Override
            public void run() {
                for(int l=0; l<=100; l++){
                    Log.e("Deneme","counter 1:"+l);


                }

            }
        };

        thread.start();
        new BackgroundTask().execute((Void) null);

        Log.e("Deneme", "1. For Loop Basliyor");
        for(int l=0; l<=100; l++){
            Log.e("Deneme","counter 1:"+l);

        }

    }

    public class BackgroundTask extends AsyncTask<Void, Integer, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setMax(100);
            progressDialog.setProgress(0);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            Log.e("Deneme", "2. For Loop Basliyor");
            for(int l=0; l<=100; l++){
                Log.e("Deneme","counter 2:"+l);

            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            progressDialog.dismiss();
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            Integer currentProgress = values[0];
            progressDialog.setProgress(currentProgress);
        }

        @Override
        protected void onCancelled(Void result) {
            super.onCancelled(result);
            progressDialog.dismiss();
        }
    }



}

Related Posts

Android AsyncTask JAVA
4/ 5
Oleh