Pemrograman Mobile

Lanjut

#2: Threads & AsyncTask

Muhamad Saad Nurul Ishlah, M.Comp.

 

Program Studi Sistem Informasi, Sekolah Vokasi,

Universitas Pakuan

Pembahasan

  • Threads
  • AsyncTask

Threads

Thread utama

  • Jalur eksekusi independen dalam program yang sedang berjalan

  • Kode dieksekusi baris demi baris

  • Aplikasi berjalan di thread Java/Kotlin yang disebut "main" atau "UI thread"

  • Memunculkan UI di layar

  • Merespon tindakan pengguna dengan menangani UI events

Thread Utama Harus Cepat

  • Hardware memperbaharui layar setiap 16ms
  • UI thread memiliki 16ms untuk melakukannya
  • Jika membutuhkan waktu terlalu lama, aplikasi akan gagap atau hang

Pengguna Menghapus Aplikasi yang Tidak Responsif

  • Jika UI menunggu sebuah operasi selesai terlalu lama
  • Framework akan memunculkan pesan dialog Application Not Responding (ANR)

Operasi-operasi Panjang

  • Operasi jaringan
  • Perhitungan panjang
  • Mengunduh/mengunggah berkas
  • Memeroses gambar
  • Memuat data

Thread Belakang Layar

Eksekusi operasi-operasi yang membutuhkan waktu lama di thread belakang layar (background thread)

 

  • AsyncTask
  • Framework Loader
  • Service

Aturan Praktis Thread di Android

  • Jangan memblokir thread UI
    • Selesaikan semua pekerjaan di bawah 16 ms untuk setiap layar
    • Jalankan pekerjaan non-UI yang lambat pada thread non-UI
  • Jangan mengakses toolkit UI Android dari luar thread UI
    • Lakukan pekerjaan UI hanya pada thread UI

AsyncTask

Apa itu AsyncTask

  • Gunakan AsyncTask untuk mengimplementasikan pekerjaan-pekerjaan di belakang layar

Override Dua Metode

  • doInBackground() - berjalan pada background thread

    • Semua pekerjaan yang akan dilakukan di belakang layar

  • onPostExecute() - berjalan pada thread utama ketika pekerjaan selesai

    • Memeroses hasil yang dikerjakan di belakang layar

    • Mempublikasikan hasil ke UI

Metode AsyncTask Lainnya

  • onPreExecute()
    • Berjalan pada thread utama
    • Mengatur pekerjaan yang akan dilakukan di belakang layar
  • onProgressUpdate()
    • Berjalan pada thread utama
    • Menerima panggilan dari metode publishProgress() dari background thread

Metode AsyncTask 

Membuat Sebuah AsyncTask

  1. Buat subkelas AsyncTask
    1. Set tipe data yang dikirimkan ke metode doInBackground()
    2. Set tipe data dari unit progres untuk metode onProgressUpdate()
    3. Set tipe data dari hasil untuk metode onPostExecute()
  2. Override metode doInBackground()
  3. Override metode onPostExecute()
  4. Opsional:
    1. Override onPreExecute()
    2. Override onProgressUpdate()
private class MyAsyncTask extends AsyncTask<URL, Integer, Bitmap> {
    
    @Override
    protected void onPreExecute() {
    	// Lakukan pekerjaan yang diperlukan sebelum doInBackground(), seperti:
        // 1. Munculkan Progress bar
        // 2. Munculkan Toast
    }
	
    @Override
    protected Bitmap doInBackground(String... query) {
        // Dapatkan bitmap
        return bitmap;
    }
	
    @Override
    protected void onProgressUpdate(Integer... progress) {
        setProgressPercent(progress[0]);
    }
	
    @Override
    protected void onPostExecute(Bitmap result) {
       // Lakukan sesuatu dengan bitmap yang didapatkan
    }

}

Selanjutnya Apa?

Panggil subkelas AsyncTask yang dibuat pada kelas Komponen, misal pada kelas MainActivity

public class MainActivity extends AppCompatActivity {
	
    ...
    
    public void loadImage (View view) {
        String query = mEditText.getText().toString();   
        new MyAsyncTask(query).execute();
    }
	
    ...
}

Contoh Implementasi

package id.ishlah.myasynctask;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    public static final String DEMO_ASYNC = "DemoAsync";
    private TextView tvStatus;

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

        tvStatus = (TextView) findViewById(R.id.tv_status);
        DemoAsync demoAsync = new DemoAsync();
        demoAsync.execute("Hello, this is AsyncTask Demo!");
    }

    private class DemoAsync extends AsyncTask<String, Void, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            tvStatus.setText("status: onPreExecute");
        }

        @Override
        protected String doInBackground(String... strings) {
            Log.d(DEMO_ASYNC, "status: doInBackground");

            try {
                Thread.sleep(5000);
            } catch (Exception e) {
                Log.d(DEMO_ASYNC, e.getMessage());
            }

            return strings[0];
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            tvStatus.setText("status: onPostExecute: "+s);
        }
    }
}

Limitasi dari AsyncTask

  • Ketika terjadi perubahan konfigurasi pada perangkat Android (misal: rotasi), Activity akan dihancurkan

  • AsyncTask tidak dapat terhubung kembali ke Activity

  • AsyncTask baru akan dibuat setiap kali terjadi perubahan konfigurasi

  • AsyncTask yang lama tetap ada

  • Aplikasi dapat kehabisan memori atau crash

Jadi, Kapan Sebaiknya Menggunakan AsyncTask?

  • Pekerjaan-pekerjaan yang pendek atau yang dapat diintrupsi

  • Pekerjaan-pekerjaan yang tidak perlu dilaporkan kembali ke UI atau pengguna

  • Pekerjaan-pekerjaan yang berprioritas rendah yang dapat ditinggalkan meski tidak selesai

  • Jika tidak, gunakan AsyncTaskLoader

Video Tutorial AsyncTask

Referensi

Referensi

Terima Kasih

Made with Slides.com