Networking - Men-download Banyak Gambar Sekaligus

Bila kita ingin men-download rangkaian gambar secara asynchronous, kita bisa memodifikasi class 'DownloadImageTask' dari latihan sebelumnya seperti berikut:
private class DownloadImageTask extends AsyncTask {

/*mengambil daftar URL gambar*/
protected Long doInBackground(String...urls) {
long imagesCount = 0;
for (int i = 0; i < urls.length; i++) {
/*download gambar*/
Bitmap imageDownloaded = DownloadImage(urls[i]);
if (imageDownloaded != null) {
/*increment perulangan gambar*/
imagesCount++;
try {
/*insert delay 3 detik*/
Thread.sleep(3000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
/*mengembalikan/menghasilkan gambar yang di-download*/
publishProgress(imageDownloaded);
}
}
/*mengembalikan nilai total gambar yang di-download*/
return imagesCount;
}

/*menampilkan gambar yang di-download*/
protected void onProgressUpdate(Bitmap... bitmap) {
img.setImageBitmap(bitmap[0]);
}

/*menampilkan gambar yang di-download*/
protected void onPostExecute(Long imagesDownloaded) {
Toast.makeText(getBaseContext(), "Total " + imagesDownloaded + " images downloaded",
Toast.LENGTH_LONG).show();
}
}

Perhatikan bahwa dalam contoh latihan ini, class 'DownloadImageTask' punya satu method lagi, yaitu 'onProgressUpdate()'. Karena pekerjaan yang dilakukan di dalam class 'AsyncTask' bisa sangat banyak, maka kita perlu memanggil method 'publishProgress()' untuk meng-update progress pekerjaan. Ini akan memicu method 'onProgressUpdate()' yang di dalam latihan ini akan menampilkan gambar yang akan di-download. Method 'onProgressUpdate' di-eksekusi di UI thread pada activity app kita, karena itu ini akan aman untuk pengelolaan thread untuk meng-update 'ImageView' dengan bitmap yang di-download dari server.

Untuk mendownload rangkaian gambar secara asynchronous di background, kita perlu membuat instans class 'BackgroundTask' danmemanggil method 'execute()', seperti berikut:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

img = (ImageView) findViewById(R.id.img);
new DownloadImageTask().execute(
"https://3.bp.blogspot.com/-aH7dPYj0Ojs/VyYtwAcqmJI/" +
"AAAAAAAAE_k/HxlzHH4eHMsUPCekKuraXPU14NC8kWKwQCLcB/" +
"s1600/Turn%2BBack%2BCrime.jpg",
"https://1.bp.blogspot.com/-T6N3ZsEJH_E/V4nEGy7QHZI/AAAAAAAAFXw/" +
"PRY5c4ZqtfQsZxQxzokOPerg4vla71zYwCLcB/s1600/" +
"Kolaborasi%2Bmencari%2Bpokemon.png",
"https://2.bp.blogspot.com/-2p4JYaGs5B4/V66zktBwPEI/AAAAAAAAFcU/" +
"Ikj7Dt-mb7cY3-nx3y1RKArRX_k_2ebSQCLcB/s1600/" +
"Ritual%2B17%2BAgustus.JPG",
"https://2.bp.blogspot.com/-AYhO4VASK_o/Vk8VpY06o-I/AAAAAAAAEdw/" +
"V1pe4NS5T6U/s1600/Gua%2BPindul%2BYogyakarta.JPG",
"https://3.bp.blogspot.com/-WmJrkaQjv2U/Vkn1aNi7fmI/AAAAAAAAEcQ/" +
"Pf7Fj8xlrqY/s1600/Ubud%2B4%2Bds.JPG");
}

Jalankan di Android emulator. Bila kita menjalankan kode di atas, gambar-gambar akan di-download di background dan ditampilkan dengan interval 3 detik. Ketika gambar terakhir di-download, class 'Toast' menampilkan jumlah total gambar yang di-download.
Catatan:
Bila bekerja dengan emulator Android dan kita sering mengakses data yang di-host di web server lokal dengan menggunakan 'localhost', maka kita bisa melakukannya pada komputer yang sama dan dalam hal seperti ini kita akan menggunakan alamat IP 10.0.2.2 bukan 127.0.0.1.

Gambar terakhir dari 5 gambar yang sudah di-download dan ditampilkan

No comments: