Ilustrasi oleh Virginia Poltrack
Selamat datang di postingan ketiga dari seri WorkManager kami. WorkManager adalah library Android Jetpack yang memudahkan penjadwalan tugas-tugas tidak bersamaan dan bisa ditunda yang harus berjalan dengan andal. Ini adalah praktik terbaik terkini untuk sebagian besar pekerjaan latar belakang di Android.
Jika Anda sudah mengikuti sejauh ini, kami sudah membahas tentang:
Dalam entri blog ini, saya akan membahas:
WorkManager di Kotlin
Cuplikan kode dalam entri blog ini ada di Kotlin, menggunakan library KTX (KoTlin eXtensions). WorkManager versi KTX menyediakan fungsi ekstensi untuk Kotlin yang lebih ringkas dan idiomatis. Anda bisa menggunakan WorkManager versi KTX untuk menambahkan dependensi pada artefak androidx.work:work-runtime-ktx ke file build.gradle Anda, seperti yang dijelaskan pada catatan rilis WorkManager. Artefak ini mencakup CoroutineWorker dan metode ekstensi lainnya yang berguna untuk WorkManager.
Lebih ringkas dan idiomatis
KTX WorkManager menyediakan sintaks yang lebih bagus ketika Anda perlu membangun objek Data untuk diberikan atau dikeluarkan dari class Worker. Dalam hal ini sintaks Java akan terlihat seperti:
Data myData = new Data.Builder()
.putInt(KEY_ONE_INT, aInt)
.putIntArray(KEY_ONE_INT_ARRAY, aIntArray)
.putString(KEY_ONE_STRING, aString)
.build();
Di Kotlin, kita bisa melakukannya jauh lebih baik dengan menggunakan fungsi pembantu workDataOf :
inline fun workDataOf(vararg pairs: Pair<String, Any?>): Data
Ini memungkinkan untuk menulis ekspresi Java sebelumnya sebagai:
val data = workDataOf(
KEY_MY_INT to myIntVar,
KEY_MY_INT_ARRAY to myIntArray,
KEY_MY_STRING to myString
)
Selain class worker yang tersedia dalam Java (Worker , ListenableWorker dan RxWorker ), terdapat juga class khusus Kotlin yang menggunakan Coroutines Kotlin untuk Pekerjaan Anda.
Perbedaan utama antara class Worker dan CoroutineWorker adalah bahwa metode doWork() dalam CoroutineWorker merupakan fungsi menangguhkan dan bisa menjalankan tugas yang tidak bersamaan, sedangkan doWork() Worker hanya dapat menjalankan tugas bersamaan. Fitur CoroutineWorker lainnya adalah ia secara otomatis menangani penghentian dan pembatalan selagi class Worker perlu mengimplementasikan metode onStopped() untuk melingkupi kasus-kasus ini.
Untuk konteks lengkap tentang berbagai opsi ini, Anda bisa merujuk ke panduan Threading dalam WorkManager .
Di sini saya ingin berfokus pada CoroutineWorker, yang mencakup beberapa perbedaan kecil tetapi penting, dan kemudian menyelami cara pengujian class CoroutineWorker Anda menggunakan fitur pengujian terbaru yang diperkenalkan di WorkManager v2.1.
Seperti yang kami tulis sebelumnya, CoroutineWorker#doWork() hanyalah fungsi menangguhkan. Ini, secara default, diluncurkan pada Dispatchers.Default:
class MyWork(context: Context, params: WorkerParameters) :
CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
// Do something
Result.success()
} catch (error: Throwable) {
Result.failure()
}
}
}
Penting untuk dipahami bahwa ini adalah perbedaan mendasar ketika menggunakan CoroutineWorker sebagai pengganti Worker atau ListenableWorker:
Tidak seperti Worker, kode ini tidak berjalan pada Executor yang ditetapkan dalam Konfigurasi WorkManager Anda.
Seperti yang baru saja kami katakan, CoroutineWorker#doWork() default-nya adalah Dispatchers.Default. Anda bisa menyesuaikannya menggunakan withContext():
class MyWork(context: Context, params: WorkerParameters) :
CoroutineWorker(context, params) {
override suspend fun doWork(): Result = withContext(Dispatchers.IO) {
return try {
// Do something
Result.success()
} catch (error: Throwable) {
Result.failure()
}
}
}
Kebutuhan untuk mengubah Dispatcher yang digunakan CoroutineWorker adalah hal yang jarang terjadi dan Dispatchers.Default merupakan opsi terbaik untuk sebagian besar kasus.
Untuk mempelajari lebih lanjut tentang cara menggunakan WorkManager dengan Kotlin, Anda bisa mencoba codelab ini .
Menguji class Worker
WorkManager memiliki beberapa artefak tambahan yang bisa mempermudah pengujian Pekerjaan Anda. Anda bisa membaca lebih lanjut tentang hal ini dalam halaman dokumentasi pengujian WorkManager dan panduan “Pengujian dengan WorkManager 2.1.0 ” yang baru. Implementasi asli untuk pembantu pengujian ini memungkinkan penyesuaian WorkManager sehingga berfungsi secara bersamaan dan Anda kemudian bisa menggunakan WorkManagerTestInitHelper#getTestDriver() untuk dapat menyimulasikan penundaan dan menguji pekerjaan berkala.
Poin utama di sini adalah Anda memodifikasi perilaku atau WorkManager untuk mengarahkan class Worker agar ia bisa diuji.
WorkManager v2.1 menambahkan fungsionalitas TestListenableWorkerBuilder baru yang memperkenalkan cara baru untuk menguji class Worker Anda.
Ini adalah update yang sangat penting untuk CoroutineWorker karena dengan TestListenableWorkerBuilder Anda benar-benar langsung menjalankan class worker untuk menguji logikanya.
@RunWith(JUnit4::class)
class MyWorkTest {
private lateinit var context: Context
@Before
fun setup() {
context = ApplicationProvider.getApplicationContext()
}
@Test
fun testMyWork() {
// Get the ListenableWorker
val worker =
TestListenableWorkerBuilder<MyWork>(context).build()
// Run the worker synchronously
val result = worker.startWork().get()
assertThat(result, `is`(Result.success()))
}
}
Hal penting di sini adalah bahwa hasil menjalankan CoroutineWorker diperoleh secara bersamaan dan Anda bisa memeriksa secara langsung apakah logika class Worker Anda sudah berperilaku dengan benar
Dengan menggunakan TestListenableWorkerBuilder, Anda bisa memberikan input data ke Worker atau mengatur runAttemptCount, sesuatu yang dapat berguna untuk menguji logika retry dalam pekerjaan Anda.
Sebagai contoh, jika Anda mengupload beberapa data ke server, Anda mungkin perlu menambahkan beberapa logika retry untuk memperhitungkan masalah konektivitas.
class MyWork(context: Context, params: WorkerParameters) :
CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val serverUrl = inputData.getString("SERVER_URL")
return try {
// Do something with the URL
Result.success()
} catch (error: TitleRefreshError) {
if (runAttemptCount <3) {
Result.retry()
} else {
Result.failure()
}
}
}
}
Anda kemudian bisa menguji logika retry ini dalam pengujian menggunakan TestListenableWorkerBuilder:
@Test
fun testMyWorkRetry() {
val data = workDataOf("SERVER_URL" to "http://fake.url ")
// Get the ListenableWorker with a RunAttemptCount of 2
val worker = TestListenableWorkerBuilder<MyWork>(context)
.setInputData(data)
.setRunAttemptCount(2)
.build()
// Start the work synchronously
val result = worker.startWork().get()
assertThat(result, `is`(Result.retry()))
}
@Test
fun testMyWorkFailure() {
val data = workDataOf("SERVER_URL" to "http://fake.url ")
// Get the ListenableWorker with a RunAttemptCount of 3
val worker = TestListenableWorkerBuilder<MyWork>(context)
.setInputData(data)
.setRunAttemptCount(3)
.build()
// Start the work synchronously
val result = worker.startWork().get()
assertThat(result, `is`(Result.failure()))
}
Kesimpulan
Dengan rilis WorkManager v2.1 dan fitur-fitur baru dalam workmanager-testing, CoroutineWorker benar-benar menonjol karena kesederhanaan dan fungsionalitasnya. Pengujian bisa dilakukan dengan sangat mudah dan pengalaman keseluruhan di Kotlin sangatlah bagus.
Jika Anda belum mencoba CoroutineWorker dan ekstensi lainnya yang termasuk dalam workmanager-runtime-ktx, saya sangat menyarankan untuk mencobanya di project Anda. Ketika saya bekerja dengan Kotlin (yang saat ini selalu saya lakukan), ini adalah cara pilihan saya untuk menggunakan WorkManager!
Saya harap Anda bisa mendapatkan manfaat dari artikel ini dan saya ingin mendengar tentang bagaimana Anda menggunakan WorkManager atau fitur WorkManager apa yang dapat dijelaskan atau didokumentasikan dengan lebih baik.
Anda bisa menghubungi saya di Twitter @pfmaggi .
Sumber Daya
https://www.bitchute.com/video/KNslNFbnne37/
ReplyDeleteI have always loved to read your blog, because you always post the most informative and interesting articles, thank you for your work. You may also check simply the best online casino website https://onlinecasinozen.com/online-casinos/. Have a lot of fun!
ReplyDeleteLink login88 adalah situs judi online yang menyediakan banyak informasi seputar judi online Seperti cmdbet, dan anda bisa melakukan login cmdbet dan daftar cmdbet pada situs kami, Baca dan simak beberapa tips dan berbagai cara untuk menang memainkan judi online di situs kami.
ReplyDeletehttp://linklogin88.com/
You can track your girlfriend's (or boyfriend's) phone and get access to all the messages and calls if you know what tools to use. Recently, I found out about an app provided by https://www.mspy.com - with it, you can easily monitor your partner's (or even your kid's) online activity and even block certain content.
ReplyDeleteloto 2
ReplyDeleteloto 3
ReplyDeleteloto 4
loto 5
loto 6
ReplyDeleteloto
loto
loto
ReplyDeleteloto
loto
loto
loto 10
ReplyDeleteloto
loto
loto
loto 11
ReplyDeleteloto
loto
loto
loto 12
ReplyDeleteloto
loto
loto
loto 13
ReplyDeleteloto
loto
loto
loto 14
ReplyDeleteloto
loto
loto
loto 15
ReplyDeleteloto
loto
loto
ReplyDeleteeski porno star filmleri, porno yıldızları japon porno zorla sikme videoları p*** sex
Hi, great thread!
ReplyDeleteTrading on 15 popular spot and futures cryptocurrency exchanges on your account via API key more you can visit at CryptoRobotics.