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)