WorkManager触发但返回失败结果

4

我正在尝试使用Android WorkManager,它成功地每隔15分钟被触发。

然而,工作未能完成,并且我的日志中出现了以下错误。

I/WM-WorkerWrapper: Worker result FAILURE for Work

enter image description here

这是我在应用程序类中设置我的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)


}

我会在应用程序类的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()
         }
     }

代码应该会触发一些工作,去下载存储库中的互联网数据。我在Postman上运行了一个@GET请求,数据返回没有错误。
这是Worker类
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 依赖项

//WorkManager - Kotlin + 协程实现 'androidx.work:work-runtime-ktx:2.6.0-alpha02'

请问我的做法有问题吗?

1个回答

2
经过大量搜索,我意识到问题出在doWork()方法上,我只“捕获”了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

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