Android CoroutineWorker 在抛出异常时如何重试

3
我正在使用以下代码进行数据库和网络请求。问题在于,即使我处理了异常,异常仍会传播到Worker并返回FAILURE。
class TaskSyncWorker @AssistedInject constructor(
    @Assisted private val appContext: Context,
    @Assisted private val params: WorkerParameters,
    private val dataManager: DataManager
) : CoroutineWorker(appContext, params) {

    companion object {
        const val TASK_LONG_ID = "taskLongId"
    }

    override suspend fun doWork(): Result {
        var success = false
        val taskLongId = inputData.getLong(TASK_LONG_ID, -1L)
        if (taskLongId != -1L) {
            coroutineScope {

                val getTaskFromDbJob = async {
                    dataManager.getTask(taskLongId)
                }

                val task = getTaskFromDbJob.await()

                val taskNetworkSyncJob = async {
                    dataManager.syncSingleTask(
                        TaskSync(
                            dataManager.getUserId(),
                            dataManager.getAccessToken(),
                            task
                        )
                    )
                }

                try {
                    val response = taskNetworkSyncJob.await()
                    if (response.isSuccessful) {
                        //val jsonObject = response.body()!!.asJsonObject
                        success = true
                    } else {
                        success = false
                    }
                } catch (e: Exception) {
                    if (e is CancellationException) {
                        Timber.d("Job was Cancelled....")
                    }
                    //Log exception
                    Timber.e("Handling Exception......")
                    Timber.e(e)
                }
            }
        } else {
            success = true
        }

        return if (success)
            Result.success()
        else
            Result.retry()
    }

    @AssistedInject.Factory
    interface Factory : ChildWorkerFactory
}

我想在出现异常时重新启动工作程序,但它失败了。

E/TaskSyncWorker$doWork: Handling Exception......
E/TaskSyncWorker$doWork: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 2 column 1 path $
        at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1568)
        at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1409)
        at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:593)
        at com.google.gson.stream.JsonReader.peek(JsonReader.java:425)
        at com.google.gson.internal.bind.TypeAdapters$29.read(TypeAdapters.java:700)
        at com.google.gson.internal.bind.TypeAdapters$29.read(TypeAdapters.java:698)
        at com.google.gson.internal.bind.TypeAdapters$35$1.read(TypeAdapters.java:894)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:225)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:121)
        at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
E/WM-WorkerWrapper: Work [ id=31e56edb-bf4f-461a-b1fc-339c80266b6e, tags={ com.vicky7230.tasker.worker.TaskSyncWorker } ] failed because it threw an exception/error
    java.util.concurrent.ExecutionException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 2 column 1 path $
        at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
        at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
        at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:298)
        at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 2 column 1 path $
        at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1568)
        at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1409)
        at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:593)
        at com.google.gson.stream.JsonReader.peek(JsonReader.java:425)
        at com.google.gson.internal.bind.TypeAdapters$29.read(TypeAdapters.java:700)
        at com.google.gson.internal.bind.TypeAdapters$29.read(TypeAdapters.java:698)
        at com.google.gson.internal.bind.TypeAdapters$35$1.read(TypeAdapters.java:894)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:225)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:121)
        at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:919) 
I/WM-WorkerWrapper: Worker result FAILURE for Work [ id=31e56edb-bf4f-461a-b1fc-339c80266b6e, tags={ com.vicky7230.tasker.worker.TaskSyncWorker } ]
1个回答

4

为了避免异常向上传播,您需要使用supervisorScope。将coroutineScope{...}更改为supervisorScope{...}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接