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
-
Buat subkelas AsyncTask
- Set tipe data yang dikirimkan ke metode doInBackground()
- Set tipe data dari unit progres untuk metode onProgressUpdate()
- Set tipe data dari hasil untuk metode onPostExecute()
- Override metode doInBackground()
- Override metode onPostExecute()
-
Opsional:
- Override onPreExecute()
- 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
-
Diterjemahkan dari slide Android Developer Fundamentasl V2: AsyncTask and AsyncTaskLoader
-
UI Thread Performance: Exceed the Android Speed Limit
-
Video Tutorial: https://www.youtube.com/watch?v=uKx0FuVriqA
Terima Kasih
PML2: Threads dan AsyncTask
By M. Saad Nurul Ishlah
PML2: Threads dan AsyncTask
- 424