【发布时间】:2020-08-09 04:22:02
【问题描述】:
我正在使用 android JobService,在此过程中,我遇到了来自 Google codelabs 的以下挑战:
挑战:到目前为止,您的 JobService 任务只是传递了一个通知,但 JobScheduler 通常用于更强大的后台任务,例如更新天气或与数据库同步。因为后台任务可能更复杂,在程序上和功能上更复杂,所以在任务完成时通知框架的工作落在了开发人员身上。幸运的是,开发人员可以通过调用 jobFinished() 来做到这一点。
这个挑战需要你在任务完成后调用jobFinished():
- 实现一个 JobService,当给定的时候启动一个 AsyncTask
满足限制条件。 - AsyncTask 应该休眠 5 秒。
- 如果在线程休眠时不再满足约束, 重新安排工作并显示一条 Toast 消息,说明该工作 失败。
好吧,我对第 3 点感到震惊。
如何确定作业运行时是否仍满足作业限制条件?
这是我的代码:
SyncActivity.kt
public fun scheduleSyncJob(view : View){
val selectedNetworkID = networkOptionsSync.checkedRadioButtonId
var selectedNetworkOption = JobInfo.NETWORK_TYPE_NONE
when (selectedNetworkID) {
R.id.noNetworkSync -> selectedNetworkOption = JobInfo.NETWORK_TYPE_NONE
R.id.anyNetworkSync -> selectedNetworkOption = JobInfo.NETWORK_TYPE_ANY
R.id.wifiNetworkSync -> selectedNetworkOption = JobInfo.NETWORK_TYPE_UNMETERED
}
val serviceName = ComponentName(packageName, AsynctaskJobService::class.java.name)
val builder = JobInfo.Builder(JOB_ID, serviceName)
.setRequiredNetworkType(selectedNetworkOption)
.setRequiresCharging(chargingSwitchSync.isChecked())
val constraintSet = ((selectedNetworkOption != JobInfo.NETWORK_TYPE_NONE) || chargingSwitchSync.isChecked)
if (constraintSet) {
val myJobInfo = builder.build()
mScheduler?.schedule(myJobInfo)
Toast.makeText(this, R.string.job_scheduled, Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, R.string.no_constraint_toast, Toast.LENGTH_SHORT).show()
}
}
如您所见,如果有任何类型的网络连接可用或设备正在充电,我正在安排我的工作。
这里是 AsynctaskJobService.kt
class AsynctaskJobService : JobService() {
override fun onStopJob(params: JobParameters?): Boolean {
TODO("Not yet implemented")
}
override fun onStartJob(jobParameters: JobParameters?): Boolean {
JobTask(this).execute(jobParameters)
return true
}
private class JobTask(private val jobService: JobService) :
AsyncTask<JobParameters?, Void?, JobParameters>() {
override fun doInBackground(vararg params: JobParameters?): JobParameters? {
Log.d("Asynctask Running", System.currentTimeMillis().toString())
SystemClock.sleep(5000)
Log.d("Asynctask Running", System.currentTimeMillis().toString())
return params[0]
}
override fun onPostExecute(jobParameters: JobParameters) {
jobService.jobFinished(jobParameters, false)
Toast.makeText(jobService, "Task Finished", Toast.LENGTH_SHORT).show();
}
}
}
【问题讨论】:
-
嗨..你有什么解决办法吗?
-
到目前为止还没有。如果您有解决方案,请在此处发布。
标签: android android-jobscheduler