Home 当 WorkManager 遇见 Kotlin
Post
Cancel

当 WorkManager 遇见 Kotlin

当 WorkManager 遇见 Kotlin

这是第三篇关于 WorkManager 的文章。 WorkManager 是 Android Jetpack 中的一个异步处理库,是当前 Android 中处理后台任务的最佳实践。

以下为前两篇:

本文将介绍:

  • Kotlin 中使用 WorkManager
  • CoroutineWorker 类
  • 使用 TestListenableWorkerBuilder 测试 CoroutineWorker

Kotlin 中使用 WorkManager

本文代码使用了 KTX 扩展,需在 build.gradle 中添加 androidx.work:work-runtime-ktx 依赖。

使用ktx 可以大大简化代码:

1
2
3
4
5
Data myData = new Data.Builder()
                            .putInt(KEY_ONE_INT, aInt)
                            .putIntArray(KEY_ONE_INT_ARRAY, aIntArray)
                            ....
                            .build()

以上 Java 代码,可用 workDataOf 简化:

1
2
3
4
5
val data = workdDataOf(
    KEY_ONE_INT to aInt,
  KEY_ONE_INT_ARRAY to aIntArray,
  ...
)

CoroutineWorker 类

WorkManager 除了 Java 中的 Worker ListenableWorkerRxWorker 外,Kotlin 自身有一个 CoroutineWorker 类。

CoroutineWorkerWorker 的主要区别是,前者的 doWork 方法是 suspend ,异步可挂起的,而后者则是同步执行任务。CoroutineWorker 的另一个重要特性是,它会自动处理任务的停止和取消,而 Worker 则需要实现 onStopped 方法来处理相关逻辑。

关于任务停止相关的信息,可详阅: Threading in WorkManager guides.

CoroutineWorker#doWork 方法是 suspend 的,所以它默认会在 Dispatchers.Default 中执行

1
2
3
4
5
6
7
8
9
10
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()
    }
  }
}

需重点关注的是,CoroutineWorker 不同于 Worker 和 ListenableWorker ,它并不在 WorkerManager 的 Configuaration 指定的 Excutor 中执行。

使用 TestListenableWorkerBuilder 测试 CoroutineWorker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RunWith(JUnit4::class)
class MyWorkTest {
  private lateinit var context: Context
  @Before fun setup() {
    context = ApplicationProvider.getApplicationContext()
  }
  @Test fun testMyWork() {
    val worker = TestListenableWorkerBuilder<MyWork>(context).build()

    val result = worker.startWork().get()

    assertThat(result,`is`(Result.success()))
  }
}
This post is licensed under CC BY 4.0 by the author.