相关疑难解决方法(0)

JobScheduler:控制从满足约束到正在运行的作业的延迟

我正在使用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秒内运行作业"?

更长版本(带有ramblings)

问题

我发现,在某些设备上,如果在已经满足网络约束的时间段内安排作业,则作业将立即运行(或者足够快以便用户感知到).

但是在其他设备上,即使已经有合适的网络连接(这样作业可以立即运行),在实际运行之前会有很长的延迟.因此,如果这是对用户操作的响应,那么就会发现没有任何事情发生并且应用程序已损坏.

现在,我很清楚这可能是JobScheduler...... 的意图是由系统来安排工作以最好地适应其他需求,并且无法保证在所有约束条件下作业将立即运行很满意.

但是如果需要的话,能够对它进行一些控制会很好.因此,对于按计划进行的工作,在没有用户参与的情况下,让系统完全控制精确计时是好的和良好的.

但是在作业响应用户操作的地方,我希望工作能够毫不拖延地运行......假设网络连接存在.(如果没有连接,则可以显示一条消息,指示在恢复网络连接时将执行操作,JobScheduler然后在网络恢复时确保作业运行.)

setOverrideDeadline()不是解决方案?

我可以看到它JobInfo.Builder确实有一种setOverrideDeadline()方法,这几乎就是我想要的.但是,这指定了从安排作业开始的最大延迟(即,即使不满足所有约束,也在10秒内运行作业),而不是从满足所有约束的时间开始(即在所有约束条件下运行作业)约束得到满足).

编辑:并且似乎有一个恼人的错误,可能导致作业在使用时运行两次setOverrideDeadline():请参阅此处此处.

那么Firebase JobDispatcher呢? …

android alarmmanager android-jobscheduler

19
推荐指数
1
解决办法
1796
查看次数

JobScheduler两次发布职位(未预期)

我正在写一篇关于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)

android android-jobscheduler

11
推荐指数
1
解决办法
2926
查看次数