Melakukan Tugas-tugas Asynchronous pada Thread Terpisah dengan Menggunakan IntentService

Pada latihan sebelumnya, kita sudah mempelajari tentang bagaimana membuat dan menjalankan suatu service dengan menggunakan method 'startService()'. Kita juga sudah tahu bagaimana cara yang benar mengeksekusi pekerjaan yang panjang/lama di background dengan thread terpisah -- bukan menggunakan thread yang sama dengan 'activity' yang memanggilnya. 

Sangatlah penting bahwa setelah service kita selesai mengeksekusi tugasnya, seharusnya service tersebut harus di-stop secepat mungkin sehingga tidak menahan semua resources yang tidak lagi diperlukan. Itulah sebabnya mengapa kita menggunakan method 'stopSelf()' untuk menghentikan service bila suatu tugas sudah selesai. Sayangnya, banyak sekali developer/programmer seringkali lupa untuk melakukan ini (menghentikan service) ketika suatu service selesai melakukan tugasnya. 


Untuk lebih memudahkan membuat service yang melakukan tugas secara asynchronous dan menghentikan dirinya sendiri bila sudah selesai, kita juga bisa menggunakan class 'IntentService' sebagai alternatifnya.

Class 'IntentService' adalah class dasar untuk 'Service' yang menangani request yang asynchronous. Class ini sama seperti service normal yang biasa; dan mengeksekusi tugasnya dalam suatu thread dan kemudian mengakhirinya secara otomatis ketika tugasnya sudah selesai dieksekusi. 

Berikut di bawah ini adalah latihan menggunakan 'IntentService'. Dalam latihan ini kita masih menggunakan project yang sama seperti latihan-latihan sebelumnya.

1. Kita buat file class java baru dengan nama "MyIntentService.java".

2. Buat kode di file tersebut seperti berikut:
package com.example.services;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

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

public class MyIntentService extends IntentService {

public MyIntentService() {
super("MyIntentServiceName");
}

protected void onHandleIntent(Intent intent) {
try {
int result = DownloadFile(new URL("https://diansano.blogspot.com/somefile.pdf"));
Log.d("IntentService", "Downloaded " + result + " bytes");
} catch (MalformedURLException e) {
e.printStackTrace();
}
}

private int DownloadFile(URL url) {
try {
/*mensimulasikan beberapa saat untuk download file*/
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 100;
}
}
3. Modifikasi dan tambahkan kode berikut (yang dicetak tebal) pada file "AndroidManifest.xml":
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.services">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyService">
<intent-filter>
<action android:name="com.example.MyService" />
</intent-filter>
</service>
<service android:name=".MyIntentService" />

</application>

</manifest>
4. Modifikasi dan tambahkan kode berikut dalam file "MainActivity.java":
public void startService(View view) {
/*startService(new Intent(getBaseContext(), MyIntentService.class));
* atau
* startService(new Intent("com.example.MyIntentService"));*/
startService(new Intent(getBaseContext(), MyIntentService.class));
}
5. Jalankan di emulator Android Studio. Klik tombol 'Start Service'. Setelah lima detik, di jendela Log akan muncul seperti berikut:
D/IntentService: Downloaded 100 bytes

Penjelasan:

Pertama, kita membuat class 'MyIntentService', yang meng-'extends' class 'IntentService' sebagai ganti class 'Service':
public class MyIntentService extends IntentService {
}

Kita perlu mengimplementasikan konstruktor dari class tersebut dan memanggil superclass-nya dengan nama 'intent service' nya (buat saja dengan suatu string):
public MyIntentService() {
super("MyIntentServiceName");
}
Kita kemudian mengimplementasikan method 'onHandleIntent()' yang dieksekusi pada thread yang bekerja:
protected void onHandleIntent(Intent intent) {
try {
int result = DownloadFile(new URL("https://diansano.blogspot.com/somefile.pdf"));
Log.d("IntentService", "Downloaded " + result + " bytes");
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
Method 'onHandleIntent()' adalah method dimana kita menuliskan kode yang perlu dieksekusi pada thread yang terpisah, misalnya mendownload file dari suatu server. Bila kode tersebut selesai mengeksekusi, thread tersebut akan diakhiri dan service akan di-stop secara otomatis.

No comments: