Android JobScheduler 需要先检查工作网络,然后 运行 其他任务
Android JobScheduler needs to check for working interrnet first and then run other tasks
好的,我正在使用 JobScheduler 将数据与数据库同步。我知道您可以在 JobScheduler 中将要求设置为 运行 一项工作,例如不按流量计费的网络等,但问题是 Jobscheduler 不会检查互联网是否正常工作,它只会检查您是否已连接到网络。我有 1 个周期性的工作,有几个任务。我创建了这个检查是否有互联网的 aync 任务。我想检查 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。当它发生时,只需将您的 reschedule Boolean 设置为 true 并且您的代码应该调用
jobFinished(yourparams,rescheduletrue)
好的,我正在使用 JobScheduler 将数据与数据库同步。我知道您可以在 JobScheduler 中将要求设置为 运行 一项工作,例如不按流量计费的网络等,但问题是 Jobscheduler 不会检查互联网是否正常工作,它只会检查您是否已连接到网络。我有 1 个周期性的工作,有几个任务。我创建了这个检查是否有互联网的 aync 任务。我想检查 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。当它发生时,只需将您的 reschedule Boolean 设置为 true 并且您的代码应该调用
jobFinished(yourparams,rescheduletrue)