WorkManager срабатывает, но возвращает результат сбоя

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


}
 

Я начинаю работу внутри 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()
         }
     }
 

Предполагается, что код должен инициировать некоторую работу по загрузке интернет-данных в хранилище. Я запустил @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'

Есть какие-нибудь зацепки по поводу того, что я делаю не так?

Ответ №1:

После долгих поисков до меня дошло, что проблема связана с 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()
        }

    }
 

Проблема не имела ничего общего с WorkManager, кроме a JsonDataException .