WorkManager 触发但 returns 失败结果

WorkManager triggered but returns Failure result

我正在尝试 Android 每 15 分钟后成功触发一次的 WorkManager。

但是,工作尚未完成,我在日志中收到此错误。

I/WM-WorkerWrapper: Worker result FAILURE for Work

这就是我设置 Constraints(在应用程序 Class 内)触发工作的方式。

 //set-up work
private fun setUpAsteroidLoadingWork() {

    //define work constraints
    val workConstraints =
            Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.UNMETERED)
                    .setRequiresCharging(false)
                    .build()

    //create WorkRequest
    val workRequest = PeriodicWorkRequestBuilder<LoadAsteroidsWorker>(15, TimeUnit.MINUTES)
        .setConstraints(
            workConstraints)
            .build()

    //get WorkManager
    val workManager = WorkManager.getInstance(this)


    //enqueue work
    workManager.enqueueUniquePeriodicWork(
            LoadAsteroidsWorker.WORK_NAME, ExistingPeriodicWorkPolicy.KEEP, workRequest)


}

我在Application里面开始工作ClassonCreate()方法

     override fun onCreate() {
        super.onCreate()
        //initialize Timber
        Timber.plant(Timber.DebugTree())
Timber.i("Application's onCreate Called")
        
        //start work inside onCreate
        runWorkInBackground()
    }

    //switch work to run on background
    private fun runWorkInBackground(){

         CoroutineScope(Default).launch {

             setUpAsteroidLoadingWork()
         }
     }

代码应该触发一些工作来下载存储库中的互联网数据。我有 运行 对邮递员的 @GET 请求,数据没有错误地返回。

这是Worker Class

class LoadAsteroidsWorker(context: Context, params: WorkerParameters) :
CoroutineWorker(context, params) {

companion object {
    const val WORK_NAME = "LoadAsteroidWorker"
}

override suspend fun doWork(): Result {
    Timber.i("do workWork() called")

    //get instance of database for use with Repo initialization below
    val db = AsteroidDatabase.getDatabaseInstance(applicationContext)

    //initialize Repo
    val repo = AsteroidRepo(db)

    return try {
        //define work i.e. load asteroids from Network for the next seven days
            repo.getAsteroidsFromNetwork()
        Timber.i("called repo method")
        Result.success()
        
    }catch (e:HttpException){
        Timber.i("error - $e")
        Result.retry()
    }

}

}

这是我的WorkManager Dependency

//WorkManager - Kotlin + coroutines implementation 'androidx.work:work-runtime-ktx:2.6.0-alpha02'

关于我做错了什么的任何线索?

经过大量搜索,我才明白问题出在 doWork() 方法上,我只是 'catching' HttpException 忘记了还有其他异常需要处理与.

我添加了第二个 catch 块,它终于捕获了 'bug'。

     override suspend fun doWork(): Result {
        Timber.i("do workWork() called")

        //get instance of database for use with Repo initialization below
        val db = AsteroidDatabase.getDatabaseInstance(applicationContext)

        //initialize Repo
        val repo = AsteroidRepo(db)

        return try {
            //define work i.e. load asteroids from Network for the next seven days
                repo.getAsteroidsFromNetwork()
            Timber.i("called repo method")
            Result.success()

        }catch (e:HttpException){
            Timber.i("error - $e")
            Result.retry()
        }catch (e: Exception){

//catch general exceptions here
            Timber.i("exception - $e")
            Result.failure()
        }

    }

该问题与 WorkManager 无关,而是 JsonDataException