Android JobScheduler需要先检查是否正常工作,然后再运行其他任务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android JobScheduler需要先检查是否正常工作,然后再运行其他任务相关的知识,希望对你有一定的参考价值。
好的我正在使用JobScheduler与数据库同步数据。我知道你可以在JobScheduler中设置要求来运行像未计量网络等工作,但问题是Jobscheduler没有检查互联网是否正常工作它只检查你是否连接到网络。我有一个周期性的Job,有几个任务。我创建了这个异步任务,检查是否有互联网。我想检查http响应(StatusCode)是否不等于200。我想立即停止工作并重新安排工作。因为如果互联网不工作,我不需要继续运行这项工作。我无法弄清楚如何立即停止作业并重新安排,因为在异步任务完成后,下一个任务开始执行。
这是我的OnStartJob和OnStopJob
@Override
public boolean onStartJob(JobParameters jobParameters) {
Log.d(TAG, "onStartJob");
new ConnectCheck(getApplicationContext(), this, jobParameters).execute();
getRetrofitObject();
myLocation();
new MyToken(getApplicationContext(), this, jobParameters).execute();
Document newMemo = new Document();
new MyWorker(getApplicationContext(), this, jobParameters).execute(newMemo);
return true;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
Log.d(TAG, "onStopJob");
return true;
}
这是我的异步任务
private static class ConnectCheck extends AsyncTask<Void, Void, Boolean> {
private final Context mContext;
private final MyJobService mJobService;
private final JobParameters mJobParams;
public ConnectCheck(Context context, MyJobService myJobService, JobParameters jobParameters) {
mContext = context;
mJobService = myJobService;
mJobParams = jobParameters;
}
@Override
protected Boolean doInBackground(Void... voids) {
Log.d(TAG, "Connect Check start!");
int statusCode = 0;
URL url = null;
try {
url = new URL("http://google.com/");
} catch (MalformedURLException e) {
e.printStackTrace();
}
HttpURLConnection http = null;
try {
http = (HttpURLConnection)url.openConnection();
} catch (IOException e) {
e.printStackTrace();
}
try {
statusCode = http.getResponseCode();
Log.d(TAG, "" +statusCode);
} catch (IOException e) {
e.printStackTrace();
}
if(statusCode!=200)
{
// reschedule a jobscheduler
Log.d(TAG, "reschedule job");
mJobService.jobFinished(mJobParams, true);
}
return false;
}
@Override
public void onPostExecute(Boolean reschedule) {
if (reschedule) {
mJobService.jobFinished(mJobParams, true);
} else {
mJobService.jobFinished(mJobParams, false);
}
Log.d(TAG, "ConnectCheck finsished ------------------------");
}
}
答案
你在做什么几乎是在正确的道路上。
请记住,互联网无法正常工作,连接将超时并抛出ioexception。如果是这样,只需将你的重新安排布尔值设置为true,你的代码就应该调用
jobFinished(yourparams,rescheduletrue)
以上是关于Android JobScheduler需要先检查是否正常工作,然后再运行其他任务的主要内容,如果未能解决你的问题,请参考以下文章
Android 7.0之JobScheduler 分析——如何使用job
Android P JobScheduler服务源码解析—— 使用Job需要注意的点
Android P JobScheduler服务源码解析—— 使用Job需要注意的点
android 性能优化JobScheduler使用及源码分析