Если ограничения перестают выполняться во время выполнения задания, перепланируйте задание и покажите сообщение Toast о том, что задание не выполнено - PullRequest
0 голосов
/ 25 апреля 2020

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

}
...