Membatalkan Job

Ibarat pekerjaan di dunia nyata, sebuah job seharusnya bisa dibatalkan. Hanya job yang sedang aktif yang dapat dibatalkan. Anda bisa melakukannya dengan memanggil fungsi cancel() seperti berikut:

1. fun main() = runBlocking { 2.     val job = launch { 3.         delay(5000) 4.         println("Start new job!") 5.     } 6.   7.     delay(2000) 8.     job.cancel() 9.     println("Cancelling job...") 10.     if (job.isCancelled){ 11.         println("Job is cancelled") 12.     } 13. }

Kode di atas menggambarkan sebuah job membutuhkan waktu 5 detik untuk dijalankan. Namun ketika mencapai waktu 2 detik, job tersebut telah dibatalkan. Saat fungsi cancel() dipanggil, job akan memasuki state Cancelling sampai pembatalan tersebut berhasil. Kemudian setelah pembatalan berhasil, job akan memiliki state Cancelled dan Completed.

Perlu diketahui bahwa jika cancel() dipanggil dalam job baru yang belum dijalankan, job tersebut tidak akan melalui state Cancelling, melainkan akan langsung memasuki state Cancelled.

Kita juga bisa menambahkan parameter terhadap fungsi cancel(), yaitu parameter cause yang bisa digunakan untuk memberitahu kenapa sebuah job dibatalkan.

1. job.cancel(cause = CancellationException("Time is up!"))

CancellationException akan mengirimkan nilainya sebagai pengecualian dari job tersebut. Kita pun bisa mengakses nilai tersebut dengan fungsi getCancellationException. Karena getCancellationException masih tahap eksperimen, Anda perlu menambahkan anotasi @InternalCoroutinesApi. Cobalah modifikasi dan jalankan kode Anda:

1. @InternalCoroutinesApi 2. fun main() = runBlocking { 3.     val job = launch { 4.         delay(5000) 5.         println("Start new job!") 6.     } 7.   8.     delay(2000) 9.     job.cancel(cause = CancellationException("time is up!")) 10.     println("Cancelling job...") 11.     if (job.isCancelled){ 12.         println("Job is cancelled because ${job.getCancellationException().message}") 13.     } 14. }

Konsol akan menampilkan hasil berikut:

Cancelling job...

Job is cancelled because time is up!