我已经使用android-priority-job-queue V2
两年了(伟大的图书馆)。安卓Workmanager
刚刚出现。我喜欢的是,它真的很容易设置,你不需要与JobScheduler
,Firebase
JobDispatcher
或AlarmManager
战斗,这是为我们做的。使用android-priority-job-queue V2
,我必须手动设置FrameworkJobSchedulerService
/GcmJobSchedulerService
。
Workmanager
可以添加特定的http url作为约束吗?有时,有些数据要发送到受保护的wifi中的服务器,并且远离地理区域。当您在服务器的地理区域中,当您的设备连接到wifi时,您需要在该服务器上保存一张图片(例如)。url约束将确保如果无法访问url,则不会执行或刷新工作请求(设置为Failure)。当与连通性一致地满足url约束时,执行工作请求。
使用android-priority-job-queue V2
,我必须实现一个逻辑,检查android-priority-job-queue V2
的shouldReRunOnThrowable(Throwable throwable, int runCount,int maxRunCount)
抛出http异常时的情况,并使用房间持久化库保存未发送的数据。然后,每次我通过BroadCastReceiver检测到连接更改状态时,我都会尝试重新发送未发送的数据,并标记那些最终发送到哪里的数据(那些在android-priority-job-queue V2
中完成onRun()
的用户)。稍后,我将通过一个定期例程从数据库中清空每一个发送的数据。这个解决方案起作用了。但是假设我想发送不同类型的数据(图片、位置等),我必须为每个不同类型的作业重写相同的例程。我不知道如何对WorkManager
做同样的事情。
有人能帮我吗?如果实现了这个特性,可以帮我指出我可能错过的部分文档吗?或者至少有一种用WorkManager
实现它的方法。
P.S:WhisperSystems‘JobManager,允许我添加自定义url。但问题是,它的持续性在某些设备(一些三星型号)上没有发挥作用。当我崩溃应用程序时,数据一直没有恢复。我上了github求助,但没有用。我并不是指责任何人,我只是想证明我一直在寻求解决这一问题的办法。
发布于 2019-04-26 18:26:59
我想我已经找到了一种方法来使它与WorkManager
一起工作,而且它的工作原理与预期的一样。这些是使它发挥作用的步骤:
1. --我将每个位置信息(包含其URL目的地)放入OneTimeWorkRequest
中,并以NetworkType.CONNECTED
为约束,并为重试设置退避策略(假设我将其设置为10分钟)。
2.在扩展Worker
的类中,在doWork()
中:
a. Ping服务器(您可以用后端设置它)被try/catch包围。
如果b.成功,则发送位置数据。在收到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;
}
https://stackoverflow.com/questions/50839302
复制相似问题