public class MainActivity extends Activity { JobScheduler js; JobInfo.Builder builder; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);js=(JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);builder=new Builder(1, new ComponentName(this, DemoService.class));builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);js.schedule(builder.build()); }}需要被调度的Job
public class DemoService extends JobService{ @Override public boolean onStartJob(JobParameters params) {// TODO Auto-generated method stubfinal JobParameters mJobParameters=params;AsyncTask<Void, Void, Void> mTask = new AsyncTask<Void, Void, Void>() {@Overrideprotected Void doInBackground(Void... params) { // TODO Auto-generated method stub return null;}@Overrideprotected void onPostExecute(Void result) { // TODO Auto-generated method stub Toast.makeText(wenfengService.this, "hello", 1000).show(); jobFinished(mJobParameters, true); super.onPostExecute(result);}};mTask.execute();return true; } @Override public boolean onStopJob(JobParameters params) {// TODO Auto-generated method stubToast.makeText(this, "bye", 1000).show();return true; }}清单
<service android:name=".DemoService "android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"/>
onStartJob.png
onStartJob函数常常有两种场景
1.不耗时的操作,这时你应该返回false
2.耗时的操作例如数据下载等,这是你应该开启一个新线程(因为JobService是跑在主线程的),并且返回true
如果调度是任务执行失败了,怎么办?
任务失败的情况有很多,例如下载失败了,例如下载过程wifi断掉了。
没问题,google提供了方便的重新调度的方法。
例如如果下载过程中,wifi断掉了,JobService会回调onStopJob函数,这是只需要把函数的返回值设置为true就可以了。当wifi重新连接后,JobService会重新回调onStartJob函数。
而如果下载失败了,例如上面的例子中的AsyncTask执行失败,怎么办呢?我们只需要在AsyncTask的onPostExecute中执行jobFinished(mJobParameters, true),这里的true代表任务要在wifi条件重新满足情况下重新调度。经典的写法如下。
开始调度
@Overridepublic boolean onStartJob(final JobParameters params) { mDownloadArtworkTask = new DownloadArtworkTask(this) { @Override protected void onPostExecute(Boolean success) {jobFinished(params, !success); } }; mDownloadArtworkTask.execute(); return true;}停止调度
@Overridepublic boolean onStopJob(final JobParameters params) { if (mDownloadArtworkTask != null) { mDownloadArtworkTask.cancel(true); } return true;}如果调度的任务老是执行失败,怎么办?
JobScheduler内部时序图
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!