gpt4 book ai didi

Android Job Scheduler - 安排作业立即且恰好执行一次

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:09:39 25 4
gpt4 key购买 nike

我正在尝试使用 android 作业调度程序来安排作业立即且恰好执行一次。

        JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

jobScheduler.cancel(1);

PersistableBundle bundle = new PersistableBundle();
bundle.putInt(JobFlags.KEY_PERIODIC_SYNC_JOB, JobFlags.JOB_TYPE_INITIAL_FETCH);

jobScheduler.schedule(new JobInfo.Builder(1,
new ComponentName(context, SyncJobLollipop.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setExtras(bundle)
.setMinimumLatency(10)
.setOverrideDeadline(24 * 3600 * 1000)
.build());

但它运行了大约 3 4 次。这里有什么问题?

这是作业类本身:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class SyncJobLollipop extends JobService implements JobFinishedListener {

@Inject
SyncJobBackend jobBackend;

private JobParameters jobParameters;

@Override
public boolean onStartJob(JobParameters jobParameters) {
((MyApplication)getApplication()).getAppComponent().inject(this);
this.jobParameters = jobParameters;
PersistableBundle bundle = jobParameters.getExtras();
int type = bundle.getInt(JobFlags.KEY_PERIODIC_SYNC_JOB);
jobBackend.onStartJob(type, this);
return true;
}

@Override
public boolean onStopJob(JobParameters jobParameters) {
jobBackend.onStopJob();
return false;
}

@Override
public void onJobFinished(boolean success) {
jobFinished(jobParameters, !success);
}

}

P.S.:我已经检查过我每次都用 false 值调用 jobFinished。

最佳答案

要只运行一次作业,您应该在后台工作程序中的 onStartJob(...) 中运行代码,并在 onStopJob(...) 被调用。

public class SyncJobLollipop extends JobService {
final Handler workHandler = new Handler();
Runnable workRunnable;

@Override
public boolean onStartJob(JobParameters params) {
workRunnable = new Runnable() {
@Override
public void run() {
// do your work here,
// such as jobBackend.onStartJob(type, this)

boolean reschedule = false;
jobFinished(params, reschedule);
}};
workHandler.post(workRunnable);
return true;
}

@Override
public boolean onStopJob(JobParameters params) {
workHandler.removeCallbacks(workRunnable);
return false;
}
}

要立即运行它,您应该将“最小延迟”和“覆盖截止日期”都设置为 1。

jobScheduler.schedule(new JobInfo.Builder(1,
new ComponentName(context, SyncJobLollipop.class))
.setExtras(bundle)
.setMinimumLatency(1)
.setOverrideDeadline(1)
.build());

请注意,操作系统的打盹模式可能会推迟 JobScheduler 任务,直到“维护期”或设备以其他方式唤醒。但是,上面的代码只会在 Doze 模式的/外部/运行,因此应该几乎没有延迟地安排作业。

关于Android Job Scheduler - 安排作业立即且恰好执行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45692181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com