我已经使用android-priority-job-queue V2
2年了(伟大的图书馆)。 Android Workmanager
刚出现。我喜欢它的是它很容易设置,你不必与JobScheduler
,Firebase
JobDispatcher
或AlarmManager
战斗,它是为我们完成的。随着android-priority-job-queue V2
我不得不手动设置FrameworkJobSchedulerService
/ GcmJobSchedulerService
。
是否有可能使用Workmanager
to添加某个http网址作为约束?有时,您希望将某些数据发送到受保护的WiFi中的服务器,并且您远离地理区域。当您在服务器的地理区域并且设备连接到wifi时,您可以稍后拍摄(例如)您必须保存在该服务器上的图片。 url约束将确保如果无法访问url,则永远不会执行工作请求,也不会刷新工作请求(设置为Failure)。当满足与连接一致的url约束时,将执行工作请求。
使用android-priority-job-queue V2
,我必须实现一个逻辑,检查android-priority-job-queue V2
的shouldReRunOnThrowable(Throwable throwable, int runCount,int maxRunCount)
何时抛出http异常并用Room Persistence Library保存未发送的数据。然后,每当我通过BroadCastReceiver检测到连接更改状态时,我会尝试重新发送未发送的数据,并标记那些最终发送的人(那些在onRun()
完成android-priority-job-queue V2
的人)。稍后我将通过周期性例程从数据库中清除每个发送的数据。此解决方案有效。但是,假设我想发送不同类型的数据(图片,位置等),我必须为每种不同类型的Job重写相同的例程。我不知道如何对WorkManager
做同样的事情。
有人可以帮助我,指出我可能错过的文档部分,如果实现此功能?或者至少用WorkManager
实现它的方法。
P.S:WhisperSystems' JobManager,允许我添加自定义网址。然而问题是它的持久性在一些设备上没有用(某些三星型号)。当我崩溃应用程序时,数据永远无法恢复。我继续使用github for help,但无济于事。我并没有指责任何人,我只是想表明我一直在寻找解决方案。
我想我已经找到了一种方法来使它与WorkManager
一起工作,并且它的工作目标已达到预期目的。以下是使其工作的步骤:
1.我将每个位置信息(包含其URL目的地)放在OneTimeWorkRequest
中,以NetworkType.CONNECTED
为约束,并设置重试的退避策略(假设我将其设置为10分钟)。
2.在扩展Worker
的班级中,在doWork()
:
一个。 Ping服务器(您可以使用后端设置)由try / catch包围
湾如果成功,则发送位置数据。收到http / https请求的成功状态后,您将返回WorkerResult.SUCCESS
C。如果你ping服务器它兑现和异常,或者在发送位置数据时你没有收到http成功,你返回WorkerResult.RETRY
现在,除非用户重置应用程序,否则位置数据将保证到达其所需的服务器(当服务器可用时)
@NonNull
@Override
public WorkerResult doWork() {
try {
//ping server (according to its URL)
//if the ping successful we send the location data to the server
//if the ping isn't successful we return WorkerResult.RETRY
} catch (Exception ex) {
ex.printStackTrace();
return WorkerResult.RETRY;
}
}
return WorkerResult.SUCCESS;
}