gpt4 book ai didi

android - 在 Evernote 中多次执行计划作业 - Android 作业

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:58 25 4
gpt4 key购买 nike

我有一个要运行的定期作业,它是在 Evernote 的 Android 作业库的帮助下实现的。

我希望实现的是每 15 分钟更新一次 MyLocation。

问题是每 15 分钟,作业似乎执行多次。

我使用 OnePlus3 设备进行测试,通过调试,我观察到LocationUpdateJob.schedule() 只调用一次,这是正确的,但是 LocationUpdateJob.onRunJob() 被调用多次,这是不正确的,但应该只调用一次每 15 分钟一次。

此外,根据 crashlytics,一些设备会抛出 illegalStateExceptions。此特殊异常仅发生在 Android 7 设备上。

这是崩溃报告中的崩溃:

    Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mydomain.myapp/MainActivity}: java.lang.IllegalStateException: Apps may not schedule more than 100 distinct jobs
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2947)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3008)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6688)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
Caused by java.lang.IllegalStateException: Apps may not schedule more than 100 distinct jobs
at android.os.Parcel.readException(Parcel.java:1701)
at android.os.Parcel.readException(Parcel.java:1646)
at android.app.job.IJobScheduler$Stub$Proxy.schedule(IJobScheduler.java:158)
at android.app.JobSchedulerImpl.schedule(JobSchedulerImpl.java:42)
at com.evernote.android.job.v21.JobProxy21.schedule(SourceFile:198)
at com.evernote.android.job.v21.JobProxy21.plantPeriodic(SourceFile:92)
at com.evernote.android.job.JobManager.scheduleWithApi(SourceFile:282)
at com.evernote.android.job.JobManager.schedule(SourceFile:240)
at com.evernote.android.job.JobRequest.schedule(SourceFile:366)
at com.mydomain.myapp.service.locationUpdate.LocationUpdateJob.schedule(SourceFile:33)
at com.mydomain.myapp.activities.HubActivity.onLoginSuccess(SourceFile:173)
at com.mydomain.myapp.activities.HubActivity.onCreate(SourceFile:115)
at android.app.Activity.performCreate(Activity.java:6912)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2900)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3008)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6688)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

这是我的代码:

应用类

@Override
public void onCreate() {
//init things....
JobManager
.create(this)
.addJobCreator(new LocationUpdateJobCreator());
}

LocationUpdateJobCreator

public class LocationUpdateJobCreator implements JobCreator {

@Override
public Job create(String s) {
switch (s) {
case LocationUpdateJob.TAG:
return new LocationUpdateJob();
default:
return null;
}
}
}

主要 Activity :

private void onLogin() {
// do other things...
LocationUpdateJob.schedule();
}

位置更新作业

public class LocationUpdateJob extends Job {

public static final String TAG = "LocationUpdateJob";
private static int jobId = -1;


public static void schedule() {
final long INTERVAL = 900000L;
final long FLEX = 300000L;
jobId = new JobRequest
.Builder(LocationUpdateJob.TAG)
.setPeriodic(INTERVAL, FLEX)
.setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
.build()
.schedule();
}


public static void stop() {
JobManager
.instance()
.cancel(jobId);
}


@NonNull
@Override
protected Result onRunJob(Params params) {
updateLocation();
return Result.SUCCESS;
}
}

我 fork 了 Evernote 的示例项目,但它们执行完全相同的步骤,但我无法弄清楚我在做什么不同。

最佳答案

我找到了整件事的答案。我正在回答这个问题,以防其他人遇到同样的问题。

好的,所以根据我上面的逻辑,这就是发生的事情:

1) 用户第一次打开应用,操作系统会安排一个作业,一直运行到无限。

2) 用户关闭并再次打开应用程序,操作系统中安排了另一项工作。

3) 到第 101 次用户打开应用程序时,现在有 100 个作业被安排,应用程序去安排第 101 个作业,这会抛出异常,因为 android 只允许应用程序安排 100 个作业(在较新的操作系统版本中).

那么,我做了什么来解决这个问题?

我修改了我的 schedule() 如下所示:

public static void schedule() {
final long INTERVAL = 900000L;
final long FLEX = 300000L;
jobId = new JobRequest
.Builder(LocationUpdateJob.TAG)
.setPeriodic(INTERVAL, 300000L)
.setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
.setPersisted(true)
.setUpdateCurrent(true)
.build()
.schedule();
}

这里与我安排的旧方法不同的是:.setUpdateCurrent(true)

所以它的作用是,每次使用标签安排作业时,它都会用新作业替换任何具有相同标签的现有作业,因此只有一个作业被安排使用该标签执行,即作业的标签是唯一的。

有一个非常简短和很好的解释here ,请阅读。

关于android - 在 Evernote 中多次执行计划作业 - Android 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46161930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com