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