【问题标题】:evernote android-job: When is the right time to set the schedule rules?evernote android-job:什么时候设置调度规则合适?
【发布时间】:2017-05-15 15:34:45
【问题描述】:

我没有找到有关此主题的任何内容,但是我很好奇您的建议或“最佳实践”是关于何时设置规则以安排任务?例如,如果我必须安排一个同步作业,只要应用程序运行,它就应该一直存在,那么

new JobRequest.Builder("...")..
  .build()
  .schedule()

被召唤?

谢谢

【问题讨论】:

    标签: android evernote android-job


    【解决方案1】:

    您应该创建 JobCreator,它将像这样实例化您的 Job 类:

    public class MyJobCreator implements JobCreator {
    
        @Override
        public Job create(String tag) {
            if (MyJob.TAG.equals(tag)) {
                return new MyJob();
            }
    
            return null;
        }
    }
    

    并在Application.onCreate()中初始化:

    JobManager.create(this).addJobCreator(new MyJobCreator());
    MyJob.scheduleJob();
    

    MyJob 可能如下所示:

    public class MyJob extends Job {
    
        public static final String TAG = "my_job_tag";
    
        @Override
        @NonNull
        protected Result onRunJob(Params params) {
            Intent i = new Intent(getContext(), MyService.class);
            getContext().startService(i);
            return Result.SUCCESS;
        }
    
        public static void scheduleJob() {
            new JobRequest.Builder(MyJob.TAG)
                    .setPeriodic(60_000L) // 1 minute
                    .setRequiredNetworkType(JobRequest.NetworkType.ANY)
                    .setPersisted(true)
                    .setUpdateCurrent(true)
                    .setRequirementsEnforced(true)
                    .build()
                    .schedule();
        }
    }
    

    【讨论】:

    • 1 分钟会抛出异常。您可能希望至少 15 分钟。
    【解决方案2】:

    扩展 shmakova 的答案,如果您的同步作业已经像这样安排,您可能需要添加一个条件:

    public static void scheduleJob() {
        if (JobManager.instance().getAllJobRequestsForTag(MyJob.TAG).isEmpty()) {
            new JobRequest.Builder(MyJob.TAG)
                    .setPeriodic(900_000L)
                    .setRequiredNetworkType(JobRequest.NetworkType.ANY)
                    .setPersisted(true)
                    .setUpdateCurrent(true)
                    .setRequirementsEnforced(true)
                    .build()
                    .schedule();
        }
    }
    

    这将防止调度多个作业

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2010-10-08
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多