当前位置: 首页 > 知识库问答 >
问题:

多次调用Android JobScheduler onStartJob

徐经武
2023-03-14

JobScheduler多次调用onStartJob(),尽管作业已完成。如果我安排一项工作,等到它完成,一切都很好。但是,如果我同时调度两个或多个具有不同ID的作业,那么在调用jobFinished()之后,再次调用onStartJob()<-code>。

例如,我计划作业1和作业2的参数完全相同,除了ID,那么顺序是:

  1. 作业1和作业2的onStartJob()
  2. 这两个作业都完成了,因此将为它们调用jobFinished()
  3. 之后,对具有相同ID的两个作业再次调用onStartJob()

我的工作很基础,并不复杂。

public class MyJobService extends JobService {

    @Override
    public boolean onStartJob(final JobParameters params) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // do something

                } finally {
                    // do not reschedule
                    jobFinished(params, false);
                }
            }
        }).start();

        // yes, job running in the background
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        // mark my background task as stopped

        // do not reschedule
        return false;
    }
}

我是这样安排工作的

JobInfo jobInfo = createBaseBuilder(request)
        .setMinimumLatency(2_000L)
        .setOverrideDeadline(4_000L)
        .setRequiresCharging(false)
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .build();

int scheduleResult = mJobScheduler.schedule(jobInfo);
// is always success

我不知道怎么了。


共有3个答案

锺伟志
2023-03-14

这是AndroidLollipop和Marshmallow的问题。正如马修·威廉姆斯在这里解释的那样,它在牛轧糖中被修复了

江烨伟
2023-03-14

我认为这与此处报告的Android错误有关,该错误显然已针对Android N修复,但将出现在早期版本中。

OP 正在使用 setOverrideDeadline()。我对上面链接的帖子中报告的问题的理解是,如果在覆盖截止时间触发时作业正在运行,则会导致作业被安排再次运行。

因此,建议是确保覆盖在作业计划之前(不确定如何实现)或完成后触发。两者似乎都不特别令人满意,但至少在Android N中似乎已经修复了。

颛孙飞
2023-03-14

我猜这是由未决的作业引起的,所以我在服务启动后调用mJobScheduler.cancelAll(),问题解决了。

 类似资料:
  • 我的主要活动是装载不同的碎片。此外,可以从MainActivity打开设置-activity。 如果用户只是在片段之间切换,那就万事大吉了。 当打开设置-activity并返回MainActivity时,onResume和onPause会被调用两次。如果用户打开设置-activity并再次返回MainActivity,onResume和onPause将被调用三次。每次用户打开“设置-activit

  • 我试图为BillingClient v.2.2.0和Kotlin协同程序编写一个包装: 正如您所见,当我试图查询购买或购买时,我确保客户已经准备好。但在生产中存在许多错误: 我试图了解问题的原因,得到了if将被多次调用。可能存在异常。我一直想知道这是怎么可能的,因为我每次调用都会创建新的侦听器?我无法在emulator或测试设备上重现此问题。有人能解释一下这里发生了什么,以及如何解决吗?

  • 我正在尝试在像这样: 然后在我的它呈现: 我正在将我的fetch记录到控制台中,它被调用了三次。流程是我在登录页面上(加载时挂载一次),我登录,它将我重定向到自己呈现的主页。此时,我在控制台中看到:

  • 我有一个代码,在那里我处理多个线程。一个线程等待它所依赖的其他一些线程的执行。 线程的运行代码如下所示 很少有其他线程等待这个线程在相同的方法中完成执行,如图所示,通过调用join()来执行run()。 假设这个线程依赖于另外三个线程,它正在等待它们在thread.join()中完成执行。即nameList大小为3,但此线程也执行了3次操作。它在for循环的外部。 我用另一种方法启动这个线程,比如

  • 问题内容: 我正在使用Swift开发iOS通用应用程序,使用自动布局功能,并且仅支持纵向模式。 我发现打过多次。而是在启动MyApp时仅被调用一次。 为什么要多次调用?是否会按顺序对每个(,等)进行约束? 任何信息将不胜感激。 问题答案: 仅被调用一次:需要加载视图时。 ,但是,每个运行循环都会在已存在或已对其调用的任何视图上调用一次- 这包括每当将子视图添加到视图,滚动,调整大小等时。

  • 我在我的应用程序中实现GCM。我已经按照GCM教程中给出的所有步骤从developer.android.com 我能够成功地从GCM获得注册ID,并且我正在将此ID传递给我的应用程序服务器。因此,成功地执行了注册步骤。 现在,当我的应用服务器向我的设备发送PUSH消息时,服务器将获得SUCCESS=8 FAILURE=0等消息,即:服务器成功发送消息,但OnMessage被调用8次取决于成功值。