Melakukan "Long-Running Tasks" pada Service

Karena service yang sudah kita buat dalam latihan sebelumnya tidak melakukan apa-apa, maka dalam latihan ini kita sedikit memodifikasi sehingga service tersebut melakukan suatu tugas. Berikut kita akan mencoba service yang mendownload suatu file dari internet.

Dengan menggunakan project yang sama seperti latihan sebelumnya, kita akan mensimulasikam service yang mendownload suatu file dari internet, dan memodifikasi file 'MyService.java" seperti berikut di bawah ini:
package com.example.services;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

import java.net.MalformedURLException;
import java.net.URL;

public class MyService extends Service {

@Override
public IBinder onBind(Intent arg0) {
return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
/*kita ingin agar service ini terus berjalan hingga
di-stop secara eksplisit, sehingga akan mengembalikan/return sticky
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); */
try {
int result = DownloadFile(new URL("https://1.bp.blogspot.com/-TN4qTAY35Dw/" +
"T_8FGlbtE6I/AAAAAAAABV0/J_zG3XXLBuQ/s1600/IMG_0182.jpg"));
Toast.makeText(getBaseContext(), "Downloaded " + result + " bytes",
Toast.LENGTH_LONG).show();
}
catch (MalformedURLException e) {
e.printStackTrace();
}
return START_STICKY;
}

private int DownloadFile(URL url) {
try {
/*men-simulasi beberapa saat untuk download file*/
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*mengembalikan angka sembarang yang menyejikam ukuran file yang di-download*/
return 100;
}

@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}

Berikutnya kita coba jalankan di Android emulator di Android Studio. Kemudian tekan tombol 'Start Service", seperti gambar berikut di bawah ini. Harap diperhatikan bahwa 'activity' akan diam/tidak merespon apapun selama beberapa detik sebelum class 'Toast' menampilkam pesan "Download 100 bytes". 

Jadi, apabila service ditujukan untuk melakukan tugas-tugas yang banyak dan panjang, sangatlah penting untuk menuliskan kode di thread yang terpisah sehingga tidak akan mengganggu app ingin tetap dijalankan.

Penjelasan

Dalam latihan ini, service kita akan memanggil method 'DownloadFile()' untuk mensimulasikan mendownload file daru URL tertentu. Method ini mengembalikan nilai jumlah total bytes yang di-download (yang kita hardcode dengan 100). Untuk mensimulasikan delay yang dialami oleh service tersebut ketika mendownload file, kita menggunakan method 'Thread.sleep()' untuk mem-pause service selama 5 detik (5000 milidetik).

Bila kita mulai/start service, harap diperhatikan bahwa 'activity' di-delay selama sekitar 5 detik, yaitu waktu yang diperlukan file untuk di-download dari internet. Selama waktu ini, seluruh 'activity' tidak akan memberi respon, yang berarti menunjukkan suatu point yang sangat penting, yaitu: Service berjalan pada thread yang sama dengan 'activity' kita. Dalam hal ini, karena service di-delay 5 detik, maka 'activity' juga mengalami hal yang sama (delay selama 5 detik).

No comments: