在 Android 中使用 JobScheduler 安排任务导致 UI 在应用程序启动时冻结
Scheduling task with JobScheduler in Android causes UI freeze on app launch
试图找出为什么我的 android 应用程序 (java) 在启动后的前 2-3 秒内没有响应(UI 元素已加载,除了菜单选项,但我无法单击任何东西),我发现延迟是由使用 JobScheduler 安排任务的命令引起的。
基本上我有一个 App
class extends Application
,我确实用 JobScheduler 设置了一个任务,每 30 分钟 运行 并执行一些操作(更新一些信息并在其值更改时提供通知)。
创建包含该任务所有详细信息的生成器后,我 运行 命令 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);
}
我已经在线程中尝试 运行ning 它,希望它会 运行 在后台并且不会冻结 UI 而 运行ning,以及其他类似的实践,但我还没有设法在后台 运行 它并且不影响 UI 的响应能力。
我怀疑应用程序的生命周期 class 可能是该问题的原因,但我没有足够的经验来确定它或知道如何克服它。
有没有人有任何类似的问题?如果是这样,您是如何解决的?
谢谢
2020 年 2 月 18 日更新: 作为解决方法,我现在首先检查工作是否已经安排好,只有在没有安排的情况下,我才会继续重新安排。
当我写调度部分时,我在文档中看到它会覆盖已经存在的作业,所以我没有担心它,但由于它会影响应用程序的性能,所以不要每次都这样做是有道理的。
话虽如此,我仍在寻找更好的解决方案,这只是一种限制冻结次数的解决方法,每次安排作业时 UI 仍会冻结。
在尝试解决我遇到的问题时遇到很多挫折后,我进行了更深入的故障排除,发现应用冻结的原因是第一个作业 运行 是 运行就在我安排的时候。
这是有道理的,但我从没想过这是问题所在。
为了克服这个新问题,我提出了一个新问题,能够跳过第一份工作 运行...
试图找出为什么我的 android 应用程序 (java) 在启动后的前 2-3 秒内没有响应(UI 元素已加载,除了菜单选项,但我无法单击任何东西),我发现延迟是由使用 JobScheduler 安排任务的命令引起的。
基本上我有一个 App
class extends Application
,我确实用 JobScheduler 设置了一个任务,每 30 分钟 运行 并执行一些操作(更新一些信息并在其值更改时提供通知)。
创建包含该任务所有详细信息的生成器后,我 运行 命令 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);
}
我已经在线程中尝试 运行ning 它,希望它会 运行 在后台并且不会冻结 UI 而 运行ning,以及其他类似的实践,但我还没有设法在后台 运行 它并且不影响 UI 的响应能力。
我怀疑应用程序的生命周期 class 可能是该问题的原因,但我没有足够的经验来确定它或知道如何克服它。 有没有人有任何类似的问题?如果是这样,您是如何解决的?
谢谢
2020 年 2 月 18 日更新: 作为解决方法,我现在首先检查工作是否已经安排好,只有在没有安排的情况下,我才会继续重新安排。 当我写调度部分时,我在文档中看到它会覆盖已经存在的作业,所以我没有担心它,但由于它会影响应用程序的性能,所以不要每次都这样做是有道理的。
话虽如此,我仍在寻找更好的解决方案,这只是一种限制冻结次数的解决方法,每次安排作业时 UI 仍会冻结。
在尝试解决我遇到的问题时遇到很多挫折后,我进行了更深入的故障排除,发现应用冻结的原因是第一个作业 运行 是 运行就在我安排的时候。
这是有道理的,但我从没想过这是问题所在。 为了克服这个新问题,我提出了一个新问题,能够跳过第一份工作 运行...