1. 1
Pemrograman Bergerak
Pertemuan 9
AsyncTask dan AsyncTaskLoader
9.1. AsyncTask dan AsyncTaskLoader
9.1.1. Threads
9.1.1.1. The main thread
● Jalur eksekusi independen dalam program yang sedang berjalan
● Kode dijalankan baris demi baris
● Aplikasi berjalan pada thread Java yang disebut "main" atau "UI thread"
● Menarik UI di layar
● Menanggapi tindakan pengguna dengan menangani peristiwa UI
9.1.1.2. Thread Utama harus cepat
● Layar pembaruan perangkat keras setiap 16 milidetik
● UI thread memiliki 16 ms untuk melakukan semua pekerjaannya
● Jika terlalu lama, aplikasi gagap atau hang
Gambar 9.1. Proses Thread
9.1.1.3. Pengguna mencopot pemasangan aplikasi yang tidak responsif
● Jika UI menunggu terlalu lama hingga operasi selesai, UI menjadi tidak responsif
● Kerangka kerja menunjukkan dialog Aplikasi Tidak Merespons (ANR)
Gambar 9.2. Dialog aplikasi tidak merespon
2. 2
9.1.1.4. Apa itu tugas jangka panjang?
● Operasi jaringan
● Perhitungan panjang
● Mengunduh / mengunggah file
● Memproses gambar
● Memuat data
Gambar 9.3. Running task
9.1.1.5. Utas latar belakang
Jalankan tugas yang berjalan lama di utas latar belakang
Gambar 9.4. Main Tread (UI Thread)
● AsyncTask
● Kerangka Loader
● Layanan
9.1.1.6. Dua aturan untuk utas Android
● Jangan blokir utas UI
○ Selesaikan semua pekerjaan dalam waktu kurang dari 16 ms untuk setiap layar
○ Jalankan pekerjaan non-UI yang lambat pada utas non-UI
● Jangan mengakses toolkit UI Android dari luar thread UI
○ Apakah UI hanya berfungsi di thread UI
3. 3
9.1.2. AsyncTask
9.1.2.1. Apa itu AsyncTask?
Menggunakan AsyncTask untuk menerapkan tugas latar belakang dasar
AsyncTask dimaksudkan untuk memungkinkan penggunaan thread UI yang tepat dan
mudah. Namun, yang paling kasus penggunaan umum adalah untuk mengintegrasikan ke
UI, dan itu akan menyebabkan kebocoran Konteks, terlewatkan callback, atau crash pada
perubahan konfigurasi. Ini juga memiliki perilaku yang tidak konsisten pada yang
berbeda versi platform, menelan pengecualian dari , dan tidak menyediakan Banyak
utilitas lebih dari menggunakan s secara langsung.doInBackgroundExecutor
AsyncTask dirancang untuk menjadi kelas pembantu di sekitar dan dan bukan merupakan
kerangka threading generik. AsyncTasks idealnya harus digunakan untuk operasi singkat
(paling lama beberapa detik (16 ms).) Jika Anda perlu menyimpan utas berjalan untuk
jangka waktu yang lama, sangat disarankan Anda menggunakan berbagai API disediakan
oleh paket seperti
,dan.ThreadHandlerjava.util.concurrentExecutorThreadPoolExecutorF
utureTask
Tugas asinkron didefinisikan oleh perhitungan yang berjalan pada utas latar belakang dan
yang hasilnya dipublikasikan di thread UI. Tugas asinkron didefinisikan oleh 3 generik
jenis, disebut
,dan,dan4langkah,disebut,,dan.ParamsProgressResultonPreExecutedoInBackg
roundonProgressUpdateonPostExecute
Gambar 9.5. Subclassing
Berikut adalah contoh subclassing:
private class DownloadFilesTask extends AsyncTask<URL, Integer,
Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
4. 4
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
Setelah dibuat, tugas dijalankan dengan sangat sederhana:
new DownloadFilesTask().execute(url1, url2, url3);
9.1.2.2. Override Dua metode
• doInBackground()—berjalan pada thread latar belakang
o Semua pekerjaan terjadi di latar belakang
• onPostExecute()—berjalan di utas utama saat pekerjaan selesai
o Hasil proses
o Mempublikasikan hasil ke UI
9.1.2.3. AsyncTask Metode pembantu
• onPreExecute()
o Berjalan di utas utama
o Menyiapkan tugas
• onProgressUpdate()
o Berjalan di utas utama
o menerima panggilan dari publishProgress() dari thread latar belakang
5. 5
9.1.2.4. AsyncTask Metode pembantu
Gambar 9. 6. AsyncTask Metode pembantu
9.1.2.5. Membuat AsyncTask
• Subkelas AsyncTask
• Berikan tipe data yang dikirim ke doInBackground()
• Menyediakan tipe data unit kemajuan untuk onProgressUpdate()
• Provide data type of result for onPostExecute() private class
MyAsyncTask extends AsyncTask<URL, Integer, Bitmap>
{...}
9.1.2.6. MyAsyncTask Definisi kelas
private class MyAsyncTask extends AsyncTask <String, Integer,
Bitmap> {...}
Gambar 9.7. MyAsyncTask Definisi kelas
• String—bisa berupa kueri, URI untuk nama file
• Integer—persentase selesai, langkah-langkah selesai
• Bitmap—gambar yang akan ditampilkan
• Gunakan Void jika tidak ada data yang diteruskan
9.1.2.7. onPreExecute() protected
void onPreExecute() {
// display a progress bar
// show a toast
}
9.1.2.8. doInBackground() protected Bitmap
doInBackground(String... query) {
6. 6
// Get the bitmap return bitmap;
}
9.1.2.9. onProgressUpdate()
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
9.1.2.10. onPostExecute()
protected void onPostExecute(Bitmap result) {
// Do something with the bitmap
}
9.1.2.11. Mulai pekerjaan latar belakang
public void loadImage (View view) {
String query = mEditText.getText().toString(); new
MyAsyncTask(query).execute();
}
9.1.2.12. Batasan(limitasi) AsyncTask
• Saat konfigurasi perangkat berubah, Aktivitas dihancurkan
• AsyncTask tidak dapat tersambung ke Aktivitas lagi
• AsyncTask baru dibuat untuk setiap perubahan konfigurasi
• AsyncTasks lama tetap ada
• Aplikasi mungkin kehabisan memori atau crash
9.1.2.13. Kapan menggunakan AsyncTask
• Tugas singkat atau terputus
• Tugas yang tidak perlu dilaporkan kembali ke UI atau pengguna
• Tugas dengan prioritas lebih rendah yang dapat dibiarkan belum selesai
• Gunakan AsyncTaskLoader sebaliknya
9.1.3. Loaders
9.1.3.1. Apa itu Loader?
• Menyediakan pemuatan data asinkron
• Menyambungkan kembali ke Aktivitas setelah perubahan konfigurasi
• Dapat memantau perubahan sumber data dan mengirimkan data baru
• Callback diterapkan di Aktivitas
• Banyak jenis loader tersedia
o AsyncTaskLoader, CursorLoader
7. 7
9.1.3.2. Mengapa menggunakan loader?
• Jalankan tugas OFF thread UI
• LoaderManager menangani perubahan konfigurasi untuk Anda
• 3 Diimplementasikan secara efisien oleh kerangka kerja
• Pengguna tidak perlu menunggu data dimuat
9.1.3.3. Apa itu LoaderManager?
• Mengelola fungsi loader melalui callback
• Dapat mengelola beberapa loader
– loader untuk data database, untuk data AsyncTask, untuk data internet...
9.1.3.4. Dapatkan loader dengan initLoader()
• Membuat dan memulai loader, atau menggunakan kembali loader yang sudah ada,
termasuk datanya
● Gunakan restartLoader() untuk menghapus data di loader yang ada
getLoaderManager().initLoader(Id,args,callback);
getLoaderManager().initLoader(0,null,this);
getSupportLoaderManager().initLoader(0,null, this);
9.1.4. Implementasi AsyncTaskLoader
9.1.4.1. AsyncTaskLoader Overview
Gambar 9.8. . AsyncTask Loader Overview
9.1.4.2. AsyncTask → AsyncTaskLoader
Gambar 9. 9. AsyncTask → AsyncTaskLoader
9.1.4.3. Langkah-langkah untuk AsyncTaskLoader subclass
• Subkelas AsyncTaskLoader
8. 8
• Menerapkan konstruktor
• loadInBackground()
• onStartLoading()
9.1.4.4. Subclass AsyncTaskLoader
public static class StringListLoader extends
AsyncTaskLoader<List<String>> {public StringListLoader(Context
context, String queryString) {super(context); mQueryString =
queryString;
}
}
9.1.4.5. loadInBackground()
public List<String> loadInBackground() {
List<String> data = new ArrayList<String>;
//TODO: Load the data from the
network or from a database
return data;
}
9.1.4.6. onStartLoading()
Ketika restartLoader() atau initLoader() dipanggil, LoaderManager
memanggil callback onStartLoading()
• Memeriksa data cache
• Mulai amati sumber data (jika perlu)
• Panggil forceLoad() untuk memuat data jika ada perubahan atau tidak ada data
cache yang dilindungi void onStartLoading() { forceLoad(); }
9.1.4.7. Menerapkan callback loader di Aktivitas
● onCreateLoader() — Membuat dan mengembalikan Loader baru untuk ID yang
diberikan
• onLoadFinished() — Dipanggil ketika loader yang dibuat sebelumnya telah
menyelesaikan muatannya
• onLoaderReset() — Dipanggil ketika loader yang dibuat sebelumnya sedang diatur
ulang sehingga datanya tidak tersedia
9.1.4.8. onCreateLoader()
@Override public Loader<List<String>> onCreateLoader(int id,
Bundle args) { return new
StringListLoader(this,args.getString("queryString"));
9. 9
}
9.1.4.9. onLoadFinished()
Results of loadInBackground() are passed to onLoadFinished()
where you can display them public void
onLoadFinished(Loader<List<String>> loader, List<String> data)
{mAdapter.setData(data);
}
9.1.4.10. onLoaderReset()
• Hanya dipanggil ketika loader dihancurkan
• Biarkan kosong sebagian besar waktu
9.1.4.11. Dapatkan loader dengan initLoader()
@Override public void onLoaderReset(final LoaderList<String>>
loader) { }
• Di Activity
• Menggunakan support library agar kompatibel dengan lebih banyak perangkat
getSupportLoaderManager().initLoader(0, null, this);
9.2. Learn more
• AsyncTask Reference
• AsyncTaskLoader Reference
• LoaderManager Reference
• Processes and Threads Guide
• Loaders Guide
• Thread Performa: Exceed the Android Speed Limit
9.3. Diskusi
AsyncTask sangat wajib ada pada aplikasi berbasis Android. Selain membuat aplikasi menjadi
lebih responsif, juga sebagai nilai lebih di mata user yang menggunakan aplikasi tersebut
karena user dapat mengetahui proses dan progress dari aktivitas yang sedang berjalan. Nah
kira-kira dalam proses apa saja AsyncTask dapat diterapkan? Berikan contohnya ya.
Jawaban:
Meskipun AsyncTask telah digunakan secara luas dalam pengembangan Android untuk
menangani tugas latar belakang dan memperbarui UI, perlu dicatat bahwa penggunaan
AsyncTask telah dikritik dan disarankan untuk digantikan dengan pendekatan yang lebih
10. 10
modern seperti menggunakan ViewModel bersama dengan LiveData, atau menggunakan
Executor dan Handler.
Namun, untuk memberikan pemahaman mengenai proses-proses apa saja AsyncTask dapat
diterapkan, berikut adalah beberapa contoh:
1. Pemanggilan Jaringan:
• Mengambil data dari internet menggunakan HTTP atau protokol lainnya tanpa
menghambat UI Thread. Contoh: mendownload file atau gambar dari server.
Gambar 9.9. Pemanggilan Jaringan
2. Operasi I/O Berat:
• Membaca atau menulis file ke penyimpanan lokal tanpa menghambat UI Thread.
Gambar 9.10. Operasi I/O Berat
3. Pengolahan Data yang Memakan Waktu:
• Melakukan pengolahan data yang memakan waktu tanpa memblokir UI Thread.
11. 11
Gambar 9.11. Pengolahan Data yang Memakan Waktu
Perhatikan bahwa penggunaan AsyncTask harus mempertimbangkan siklus hidup aktivitas
yang memanggilnya, dan perlu dihindari dalam beberapa skenario terkait siklus hidup dan
konfigurasi yang lebih kompleks. Oleh karena itu, alternatif seperti ViewModel dan LiveData
disarankan untuk mengatasi kelemahan-kelemahan yang mungkin muncul dengan penggunaan
AsyncTask.
DAFTAR PUSTAKA
[1] Google, D. (2021, 09 24). Dasar-Dasar Developer Android. Retrieved from Google
Developers: https://developers.google.com/training/courses/android-
fundamentals?hl=id