Skip to content

Instantly share code, notes, and snippets.

@anantyan
Last active January 23, 2024 08:07
Show Gist options
  • Save anantyan/9dd7fb988d569735fbb901548c23d61b to your computer and use it in GitHub Desktop.
Save anantyan/9dd7fb988d569735fbb901548c23d61b to your computer and use it in GitHub Desktop.
Ringkasan kode untuk kebutuhan WorkManager Basic yang dibuat
// case ketika request reminder sebelum waktu jadwal 2x - 6jam
// setelah itu reminder terakhir sebelum waktu jadwal 1.5jam
val reminderData = Data.Builder()
.putLong(DELAY, <Input Delay : Long>)
.putLong(INTERVAL, <Input Interval : Long>)
.build()
val reminderConstraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val reminderWorkRequest = PeriodicWorkRequest.Builder<ReminderWorker>()
.setInputData(reminderData)
.setConstraints(reminderConstraints)
.setPeriodicInterval(interval, TimeUnit.HOURS)
.setMaxAttempts(2)
.build()
// Jadwalkan reminder pertama
WorkManager.getInstance(this).enqueue(reminderWorkRequest)
// Jadwalkan reminder kedua 1.5jam sebelum waktu jadwal
val reminderWorkRequest2 = OneTimeWorkRequest.Builder<ReminderWorker>()
.setInputData(reminderData)
.setConstraints(reminderConstraints)
.setInitialDelay(<Input Delay : Long> - 1.5 * 60 * 60 * 1000, TimeUnit.MILLISECONDS)
.build()
WorkManager.getInstance(this).enqueue(reminderWorkRequest2)
val tenggatWaktu = System.currentTimeMillis()
// Konversi ke TimeUnit.MILLISECOND
val tenggatWaktuMillis = tenggatWaktu * 1000L
fun Context.uploadWorker(path: String?, tenggatWaktu: Long) {
val uploadData = Data.Builder()
.putString(IMAGE_PATH, path)
.build()
val uploadConstraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
// Delay untuk reminder 6 jam sebelum tenggat waktu
val delay6Jam = tenggatWaktuMillis - 6 * 60 * 60 * 1000L
// Delay untuk reminder 1.5 jam sebelum tenggat waktu
val delay15Jam = tenggatWaktuMillis - 1.5 * 60 * 60 * 1000L
// Delay untuk reminder 3 jam sebelum tenggat waktu
val delay3Jam = tenggatWaktuMillis - 3 * 60 * 60 * 1000L
// Jadwalkan reminder 6 jam sebelum tenggat waktu
WorkManager.getInstance(this).oneTimeScheduleWork(
"reminder_work_1",
delay6Jam,
TimeUnit.MILLISECONDS,
OneTimeWorkRequest.Builder<UploadWorker>()
.setInputData(uploadData)
.setConstraints(uploadConstraints)
.build()
)
// Jadwalkan reminder 1.5 jam sebelum tenggat waktu
WorkManager.getInstance(this).oneTimeScheduleWork(
"reminder_work_2",
delay15Jam,
TimeUnit.MILLISECONDS,
OneTimeWorkRequest.Builder<UploadWorker>()
.setInputData(uploadData)
.setConstraints(uploadConstraints)
.build()
)
// Jadwalkan reminder 3 jam sebelum tenggat waktu
WorkManager.getInstance(this).oneTimeScheduleWork(
"reminder_work_3",
delay3Jam,
TimeUnit.MILLISECONDS,
OneTimeWorkRequest.Builder<UploadWorker>()
.setInputData(uploadData)
.setConstraints(uploadConstraints)
.addTag("reminder_work_2")
.build()
)
}
// Membuat kebijakan retry menggunakan RetryPolicy:
val retryPolicy = RetryPolicy
.builder()
.setInitialBackoff(1, TimeUnit.MINUTES) // Waktu awal sebelum mencoba ulang (1 menit)
.setMaximumBackoff(1, TimeUnit.HOURS) // Waktu maksimum sebelum mencoba ulang (1 jam)
.setBackoffDelay(3, TimeUnit.HOURS) // Jeda 3 jam antara upaya
.build()
// Mengatur constraints untuk tugas Anda, seperti ketika tugas memerlukan koneksi internet dan baterai yang tersisa > 10%:
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // Hanya jalankan saat terhubung ke internet
.setRequiresBatteryNotLow(true) // Opsi tambahan jika perlu
.build()
// Menggunakan PeriodicWorkRequestBuilder untuk menjadwalkan tugas berkala setiap 7 hari:
val backupWorkRequest = PeriodicWorkRequestBuilder<BackupWorker>(
7, TimeUnit.DAYS
)
.setConstraints(constraints)
.setBackoffCriteria(retryPolicy, BackoffPolicy.EXPONENTIAL) // Mengatur kebijakan retry
.build()
// Menggunakan WorkManager untuk menjadwalkan dan menjalankan tugas:
WorkManager.getInstance(context).enqueue(backupWorkRequest)

Ada perbedaan antara BackoffPolicy.EXPONENTIAL dan BackoffPolicy.LINEAR dalam setBackoffCriteria yang digunakan dalam kebijakan retry. Ini memengaruhi cara waktu penundaan antara upaya tugas yang gagal dihitung. Berikut penjelasannya:

  1. BackoffPolicy.EXPONENTIAL:
    • Dengan BackoffPolicy.EXPONENTIAL, waktu penundaan antara upaya tugas yang gagal akan meningkat secara eksponensial setiap kali tugas mencoba ulang.
    • Misalnya, jika tugas gagal pertama kali pada pukul 10:00 dan Anda mengatur setInitialBackoff(1, TimeUnit.MINUTES) dan setBackoffPolicy(BackoffPolicy.EXPONENTIAL), maka penundaan antara upaya pertama dan kedua mungkin menjadi 1 menit, dan penundaan antara upaya kedua dan ketiga mungkin menjadi 2 menit, dan seterusnya.
    • Ini berarti waktu penundaan akan meningkat secara eksponensial setiap kali tugas gagal, yang dapat memberikan waktu untuk pemulihan sebelum mencoba ulang lagi.
  2. BackoffPolicy.LINEAR:
    • Dengan BackoffPolicy.LINEAR, waktu penundaan antara upaya tugas yang gagal akan meningkat secara linear.
    • Misalnya, jika tugas gagal pertama kali pada pukul 10:00 dan Anda mengatur setInitialBackoff(1, TimeUnit.MINUTES) dan setBackoffPolicy(BackoffPolicy.LINEAR), maka penundaan antara upaya pertama dan kedua mungkin menjadi 1 menit, dan penundaan antara upaya kedua dan ketiga juga akan menjadi 1 menit, dan seterusnya.
    • Ini berarti waktu penundaan akan tetap konstan setiap kali tugas mencoba ulang, tanpa peningkatan eksponensial.

Anda harus memilih jenis kebijakan yang sesuai dengan kebutuhan dan preferensi Anda. Penggunaan BackoffPolicy.EXPONENTIAL sering digunakan ketika Anda ingin memberikan waktu lebih banyak untuk pemulihan atau mengurangi tekanan pada sumber daya. Sedangkan BackoffPolicy.LINEAR sering digunakan ketika Anda ingin waktu penundaan antara upaya tetap konsisten.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment