Android-native

WorkManager untuk Background Task

Hello semuanya.. Selamat datang di tulisan pertama saya. Ini tulisan pertama saya sejak masa perkuliahan. Kenapa mau nulis lagi? Karena saya sendiri...

Ikhwan Written by Ikhwan · 2 min read >

Hello semuanya..

Selamat datang di tulisan pertama saya. Ini tulisan pertama saya sejak masa perkuliahan. Kenapa mau nulis lagi? Karena saya sendiri merasa butuh catatan untuk diri sendiri, berbagi pengetahuan, dan berbagai hal lainnya.

Jika ada yang salah di dalam tulisan ini, silahkan untuk memberikan tanggapan, terimakasih .

Oke, untuk kali ini Saya akan membahas tentang Work Manager. Apa itu? dan kenapa harus make itu?


Work manager adalah salah satu topic yang tergabung ke Android Jetpack. Dengannya, Anda dapat menjadwalkan schedule deferrable dan asynchronous tasks yang diharapkan dijalankan meskipun aplikasi keluar atau perangkat dihidupkan ulang.

  1. Melakukan task ketika device memiliki koneksi internet atau dalam keadaan charging
  2. Menjadwalkan task async untuk satu kali proses atau periodic
  3. Monitor dan manage task
  4. Menyambungkan berbagai task
  5. Memastikan task tereksekusi, meskipun device direstart
  6. Mematuhi fitur hemat daya seperti mode Doze

Oke, mari bahas codenya.

Pertama. Buka file build.gradle project anda dan tambahkan google() repository

allprojects {
    repositories {
        google()
        jcenter()
    }
}

Jangan lupa dengan depedenciesnya.

dependencies {
     implementation "android.arch.work:work-runtime:1.0.0"
}

Sync project anda, dan selanjutnya kita akan membuat kelas Worker. Kelas ini berfungsi untuk menjalankan code di background nantinya. Di tulisan ini, Saya akan membuat news worker untuk synchronize data berita saya

import android.content.Context
import android.os.StrictMode
import androidx.work.ListenableWorker
import androidx.work.Worker
import androidx.work.WorkerParameters

class NewsWorker(appContext: Context, workerParams:WorkerParameters) : Worker(appContext, workerParams) {    
   override fun doWork(): Result {
        if(snycNewsData())
             return ListenableWorker.Result.success()
        else
             return ListenableWorker.Result.failure()
    }

    fun snycNewsData(): Boolean {
 
        //Sync News Data
 
        return true 
    }
}

Poin penting di class worker adalah di function doWork. Setiap hal yang ingin kamu lakukan di background, bisnis logic, letakkan semuany di function ini. Jika background task kamu berjalan lancar, tanpa ada masalah, kamu bisa mengatur return value dengan ListenableWorker.Result.success(). Sedangkan jika terjadi kegagalan silahkan atur return value dengan ListenableWorker.Result.failure().

Sekarang, kita akan menjalakan kelas worker dari activity

var mWorkManager = WorkManager.getInstance()
mWorkManager.beginUniqueWork(
        "UniqueWork", ExistingWorkPolicy.REPLACE,  
        OneTimeWorkRequest.from(NewsWorker::class.java)).enqueue()
}

Dengan kode tersebut, kita akan menjalankan kelas worker yang unik. Fungsi dari string “UniqueWork” adalah untuk menandai kelas worker tersebut agar dapat diakses lagi nantinya. Jika ada kelas worker lainnya dengan tanda pengenal yang sama, maka worker yang sebelumnya akan ditimpa dengan worker yang baru. Hal ini terjadi karena ExistingWorkPolicy.REPLACE.

Oke, sampai disini kamu telah berhasil membuat sebuah task sederhana dengan WorkManager. Selamat ya.


WorkManager berantai

Selanjutnya mari buat task dengan kondisi yang berbeda. Asumsikan kita ingin menjalankan beberapa task berurutan. Sebelumnya kita sudah membuat satu class worker. Sekarang kita akan membuat satu kelas worker lagi

import android.content.Context
import android.os.StrictMode
import androidx.work.ListenableWorker
import androidx.work.Worker
import androidx.work.WorkerParameters

class ProfileWorker(appContext: Context, workerParams: WorkerParameters) : Worker(appContext, workerParams) {
   override fun doWork(): Result {
        if(snycProfile())
             return ListenableWorker.Result.success()
        else
             return ListenableWorker.Result.failure()
    }

    fun snycProfile(): Boolean {
 
        //Sync News Data
 
        return true 
    }
}

Sekarang kita memiliki 2 kelas worker. Kita ingin menjalankan Profile Worker terlebih dahulu, dan setelah task tersebut selesai, kita ingin proses dilanjutkan dengan News Worker. Ayo buat codenya.

var mWorkManager = WorkManager.getInstance()
var workContinue = mWorkManager.beginUniqueWork(
    "ContinueWorker",
    ExistingWorkPolicy.REPLACE, 
    OneTimeWorkRequest.from(ProfileWorker::class.java)
)

workContinue = workContinue.then(
    OneTimeWorkRequest.from(NewsWorker::class.java))
workContinue.enqueue()

Gunakan then untuk menambahkan task lainnya, agar task dapat berlanjut.

Selamat, sekarang kamu telah berhasil membuat sebuah Cotinue Task dengan Work Manager


WorkManager dengan kondisi device

Sekarang kita ingin menjalankan sebuah task dengan kondisi device harus terhubung ke internet. Jadi ketika koneksi internet tersedia, task akan berjalan. Kita akan menambahkan code tambahan untuk kondisi ini.

var mWorkManager = WorkManager.getInstance()
mWorkManager.beginUniqueWork(
    NewsWorker.CONST_OUTPUT,
    ExistingWorkPolicy.REPLACE,
    OneTimeWorkRequest.Builder(NewsWorker::class.java)
       .setConstraints( 
           Constraints.Builder()   
     .setRequiredNetworkType(NetworkType.CONNECTED).build()).build()
    ).enqueue()

Oke, kita telah membuat sebuah task dengan koneksi internet sebagai requirementnya dengan WorkManager.


Periodic Work

Sekarang kita akan membuat sebuah periodic task dengan work manager. Asumsikan kita akan menjalankan News Worker setiap 20 menit.

var mWorkManager = WorkManager.getInstance()
val periodicWork = PeriodicWorkRequest.Builder(
                   NewsWorker::class.java, 20, TimeUnit.MINUTES)
                   .build()
mWorkManager.enqueue(periodicWork)

Selamat. Sekarang kita telah membuat berbagai background task dengan Work Manager.


Catatan:

Pertama, asumsikan kita memiliki sebuah periodic task dengan waktu interval 20 menit. Task pertama akan berjalan pada jam 9:00 a.m. Task selanjutnya tentu akan berjalan pada jam 9:20 a.m? Jawabannya adalah mungkin. Untuk alasan tertentu task selanjutnya akan berjalan sesuai dengan interval, dan kadang tidak. Tetapi task tetap berjalan sesuai dengan intervalnya.

  • 9:00 a.m. task pertama berjalan
  • 9:22 a.m. task kedua berjalan dengan penundaan 2 menit
  • 9:40 a.m. task ketiga berjalan sesuai dengan intervalnya kembali
  • 10:00 a.m. task keempat berjalan
  • dst

Kedua, periodic task bisa berjalan dengan performa yang baik, jika interval waktu yang diatur lebih dari 15 menit.


Terimakasih untuk waktunya, btw untuk sample codenya silahkan berkunjung ke github saya.

https://github.com/IkhwanSI13/Sample_Work_Manager

Sampai jumpa.. 😀

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *