Я играю с 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();
}
}
}