我正在使用JobScheduler来安排工作.主要是我将它用于该.setRequiredNetworkType()方法,该方法允许您指定在建立网络连接(或更具体地说是未计量连接)时只希望调度作业.
我正在使用以下相当简单的代码来安排我的工作:
PersistableBundle extras = new PersistableBundle();
extras.putInt("anExtraInt", someInt);
int networkConstraint = useUnmetered ? JobInfo.NETWORK_TYPE_UNMETERED : JobInfo.NETWORK_TYPE_ANY;
ComponentName componentName = new ComponentName(context, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(jobId, componentName)
.setRequiredNetworkType(networkConstraint)
.setExtras(extras)
.build();
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(jobInfo);
Run Code Online (Sandbox Code Playgroud)
因此,调度只有一个约束:网络连接(可以是"任何"或"未计量").
如何指定满足所有约束的最大延迟,以及实际运行作业,例如"在网络连接的2秒内运行作业"?
问题
我发现,在某些设备上,如果在已经满足网络约束的时间段内安排作业,则作业将立即运行(或者足够快以便用户感知到).
但是在其他设备上,即使已经有合适的网络连接(这样作业可以立即运行),在实际运行之前会有很长的延迟.因此,如果这是对用户操作的响应,那么就会发现没有任何事情发生并且应用程序已损坏.
现在,我很清楚这可能是JobScheduler...... 的意图是由系统来安排工作以最好地适应其他需求,并且无法保证在所有约束条件下作业将立即运行很满意.
但是如果需要的话,能够对它进行一些控制会很好.因此,对于按计划进行的工作,在没有用户参与的情况下,让系统完全控制精确计时是好的和良好的.
但是在作业响应用户操作的地方,我希望工作能够毫不拖延地运行......假设网络连接存在.(如果没有连接,则可以显示一条消息,指示在恢复网络连接时将执行操作,JobScheduler然后在网络恢复时确保作业运行.)
setOverrideDeadline()不是解决方案?
我可以看到它JobInfo.Builder确实有一种setOverrideDeadline()方法,这几乎就是我想要的.但是,这指定了从安排作业开始的最大延迟(即,即使不满足所有约束,也在10秒内运行作业),而不是从满足所有约束的时间开始(即在所有约束条件下运行作业)约束得到满足).
编辑:并且似乎有一个恼人的错误,可能导致作业在使用时运行两次setOverrideDeadline():请参阅此处和此处.
那么Firebase JobDispatcher呢? …
我正在写一篇关于JobScheduler的教程,我发现了一个奇怪的行为.我要求在1秒内安排3个不同的作业(.setOverrideDeadline(1000)),但它们都被提交并运行了两次......所以这里的代码:
public class MyApplication extends Application {
private static final int JOB_ID_HanlderThread = 100;
private static final int JOB_ID_ExecutorService = 200;
private static final int JOB_ID_AsyncTask = 300;
JobScheduler mJobScheduler;
ExecutorService myExecutorServiceForJobs=null;
private static MyApplication INSTANCE;
public static MyApplication getInstance(){
return INSTANCE;
}
/**
* Called when the application is starting, before any activity, service,
* or receiver objects (excluding content providers) have been created.
* Implementations should be as quick as possible (for example using
* lazy initialization of …Run Code Online (Sandbox Code Playgroud)