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();
}
}
}
Android AsyncTask JAVA
4/
5
Oleh
Adsız