【问题标题】:If the constraints stop being met while the job is running, reschedule the job and show a Toast message saying that the job failed如果在作业运行时不再满足约束,请重新安排作业并显示 Toast 消息,说明作业失败
【发布时间】: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


【解决方案1】:

这个我试过了。。

作业的主要限制是仅限 WIFI 网络。 每当满足约束条件时,就会调用 onStopJob 回调方法。因此我在这里展示了我的信息。

你可以试试这个。

以下是我的工作服务(在 java 中)。

public class MyJobService extends JobService {
    private MyBackgroundTask myBackgroundTask;

    @Override
    public boolean onStartJob(final JobParameters params) {
        myBackgroundTask = new MyBackgroundTask();
        Log.e("Test", Thread.currentThread().getName());
        myBackgroundTask.execute(params);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        if (myBackgroundTask != null) {
            myBackgroundTask.cancel(true);
            Toast.makeText(getApplicationContext(), "Job Interrupted", Toast.LENGTH_SHORT).show();
        }
        return true;
    }

    class MyBackgroundTask extends AsyncTask<JobParameters, Void, Boolean> {

        private JobParameters parameters;

        @Override
        protected Boolean doInBackground(JobParameters... jobParameters) {
            try {
                parameters = jobParameters[0];
                Thread.sleep(5000);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            if (aBoolean) {
                Toast.makeText(getApplicationContext(), "Job Complete", Toast.LENGTH_SHORT).show();
            }
            jobFinished(parameters, !aBoolean);
        }
    }
}

【讨论】:

  • 感谢您的回复。将在一两天内尝试此操作。如果有效,将接受此答案。
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 2020-05-10
  • 2016-08-11
  • 2021-01-05
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多