Bu derste uzun sürecek işlemler için kullanılacak Asynctask sınıfını incelemeye başlıyoruz.
Daha önceden de dediğimiz gibi servisler arka planda çalışan nesneler olsa da main thread üzerinde çalışır. Bu yüzden uzun sürecek işlemler için service sınıfını direk olarak kullanıp arayüzü kitlememek yani main threadi meşgul etmemk gerekiyor. Aksi taktirde not responding hatası alırız ve uygulamamız kapanır.
Uzun süren işlemler için Asynctask sınıfını kullanabiliriz. Asynctask sınıfı abstract bir sınıftır ve baska bir sınıfın bu sınıftan türetilmesi ile kullanılır. Temel methodları şu şekildedir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public class MySyncTask 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 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. Çünkü bu method diğer methodların aksine main thread üzerinde değil background yani worker thread üzerinde çalıştırı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. Yapılan işlemin ilerleyişi gösterilmek isteniyorsa bu method içinden onProgressUpdate methoduna veri gönderilebilir.
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.
Asysnctask sınıfını belirtirken
Tip1 : doInBackground metoduna verilecek parametrelerin tipini ya da sınıfını belirler .
Tip2 : doInBackground metodunun işleyişi sırasında onProgressUpdate metoduna paslanacak değişkenin tipini ya da sınıfını belirtir.
Tip3 : onPostExecute metoduna verilen değişkendir ve aynı zamanda doInBackground metodunun return tipidir.
protected Void doInBackground(Integer… params) kodu arka planda çalışacak olan bu methodun geriye bir şey göndermeyeceğini ama integer tipte bir diziyi parametre olarak alacağını söyler. Bu yüzden;
class MyAsyncTask extends AsyncTask
Daha fazla detayı videoda ve ilerleyen derslerde bulabilirsiniz. Bu derste yazılan kodlar aşağıdaki gibidir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void servisBaslat(View view) { Intent intent = new Intent(MainActivity.this, MyStartedService.class); intent.putExtra("sleepTime", 15); startService(intent); } public void servisDurdur(View view) { Intent intent = new Intent(MainActivity.this, MyStartedService.class); stopService(intent); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
public class MyStartedService extends Service { private static final String TAG = MyStartedService.class.getSimpleName(); @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "ONCREATE ÇAĞRILDI " + Thread.currentThread().getName() + " THREAD UZERINDE ÇALIŞIYOR"); } @Override public void onDestroy() { super.onDestroy(); Log.i(TAG, "ONDESTROY ÇAĞRILDI " + Thread.currentThread().getName() + " THREAD UZERINDE ÇALIŞIYOR"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "ON START COMMAND ÇAĞRILDI " + Thread.currentThread().getName() + " THREAD UZERINDE ÇALIŞIYOR"); int sleepTime=intent.getIntExtra("sleepTime", 1); new MyAsyncTask().execute(sleepTime); return START_REDELIVER_INTENT; } class MyAsyncTask extends AsyncTask<Integer, Void, Void>{ private final String TAG=MyAsyncTask.class.getSimpleName(); @Override protected void onPreExecute() { Log.e(TAG, "PRE EXECUTE ÇAĞRILDI " + Thread.currentThread().getName() + " THREAD UZERINDE ÇALIŞIYOR"); super.onPreExecute(); } @Override protected Void doInBackground(Integer... params) { Log.e(TAG, "DOINBACKGROUND ÇAĞRILDI " + Thread.currentThread().getName() + " THREAD UZERINDE ÇALIŞIYOR"); int sleepTime=params[0]; try { Thread.sleep(sleepTime * 1000); } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void aVoid) { Log.e(TAG, "POST EXECUTE ÇAĞRILDI " + Thread.currentThread().getName() + " THREAD UZERINDE ÇALIŞIYOR"); super.onPostExecute(aVoid); } @Override protected void onProgressUpdate(Void... values) { Log.e(TAG, "PROGRESS UPDATE ÇAĞRILDI " + Thread.currentThread().getName() + " THREAD UZERINDE ÇALIŞIYOR"); super.onProgressUpdate(values); } @Override protected void onCancelled() { Log.e(TAG, "CANCEL ÇAĞRILDI " + Thread.currentThread().getName() + " THREAD UZERINDE ÇALIŞIYOR"); super.onCancelled(); } } } |