【问题标题】:Scheduling task with JobScheduler in Android causes UI freeze on app launch在 Android 中使用 JobScheduler 调度任务会导致 UI 在应用启动时冻结
【发布时间】:2021-02-11 18:02:37
【问题描述】:

在试图找出为什么我的 android 应用程序 (java) 在启动后的前 2-3 秒内没有响应(UI 元素已加载,除了菜单选项,但我无法单击任何内容),我发现了延迟是由使用 JobScheduler 调度任务的命令引起的。

基本上我有一个Appextends Application 的类,并且在那里我使用 JobScheduler 设置了一个任务,该任务将每 30 分钟运行一次并执行一些操作(更新一些信息并在其值发生更改时提供通知)。

在创建包含该任务所有详细信息的 Builder 后,我运行命令 scheduler.schedule(info) 并通过将其注释掉,我发现这是我的应用在启动后 2-3 秒无响应的原因。

private void scheduleJob() {
    ComponentName componentName = new ComponentName(this, myRecurringTask.class);
    JobInfo info = new JobInfo.Builder(JOB_ID, componentName)
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
            .setPersisted(true)
            .setPeriodic(1800000)
            .build();
    JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
    scheduler.schedule(info);
}

我已经尝试在线程中运行它,希望它能够在后台运行并且在运行时不会冻结 UI,以及其他类似的做法,但我还没有设法在后台运行它并且不会影响 UI响应能力。

我怀疑 App 类的生命周期可能是导致该问题的原因,但我没有足够的经验来确定它,或者知道如何克服它。 有没有人遇到过类似的问题?如果是这样,您是如何解决的?

谢谢


2020 年 2 月 18 日更新: 作为一种解决方法,我现在首先检查作业是否已安排好,如果不是,我会继续重新安排。 当我写调度部分时,我在文档中看到如果它已经存在它会覆盖作业,所以我并不担心它,但由于它会影响应用程序的性能,所以不要每次都这样做是有意义的。

话虽如此,我仍在寻找更好的解决方案,这只是一种限制冻结时间的解决方法,每次安排作业时 UI 仍会冻结。

【问题讨论】:

    标签: android delay android-jobscheduler


    【解决方案1】:

    在尝试解决我遇到的问题时遇到很多挫折后,我进行了更深入的故障排除,我发现应用程序冻结的原因是第一个作业运行在我安排它时运行正确。

    这是有道理的,但我从没想过这是问题所在。 我提出了一个新问题,以克服这个新问题,能够跳过第一次工作......

    JobScheduler - How to skip first job run of periodic job?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多