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'
关于我做错了什么有任何线索吗?
经过大量搜索后,我意识到问题出在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.
| 归档时间: |
|
| 查看次数: |
3027 次 |
| 最近记录: |