WorkManager 已触发但返回 Failure 结果

Fan*_*dez 5 android android-workmanager

我正在尝试 Android WorkManager,它每 15 分钟就会成功触发一次。

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

I/WM-WorkerWrapper: Worker result FAILURE for Work

在此输入图像描述

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

 //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)


}
Run Code Online (Sandbox Code Playgroud)

onCreate()我在应用程序类方法中开始工作

     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()
         }
     }
Run Code Online (Sandbox Code Playgroud)

该代码应该触发一些工作来下载存储库中的互联网数据。我已经@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()
    }

}
Run Code Online (Sandbox Code Playgroud)

}

这是我的WorkManager Dependency

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

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

Fan*_*dez 2

经过大量搜索后,我意识到问题出在doWork()我只是“捕捉”HttpException忘记还有其他异常需要处理的方法上。

我添加了第二个 catch 块,它最终捕获了“错误”。

     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()
        }

    }
Run Code Online (Sandbox Code Playgroud)

该问题与 WorkManager 无关,而是JsonDataException.