WorkManager 自定义 URL 约束?
WorkManager custom URL constraint?
我已经使用 android-priority-job-queue V2
两年了(很棒的图书馆)。 Android Workmanager
刚刚出现。我喜欢它的一点是它真的很容易设置,你不必与 JobScheduler
、Firebase
、JobDispatcher
或 AlarmManager
打架,它就完成了为了我们。使用 android-priority-job-queue V2
我不得不手动设置 FrameworkJobSchedulerService
/GcmJobSchedulerService
.
是否可以使用 Workmanager
添加某个 http url 作为约束?有时,您想要将一些数据发送到受保护的 wifi 中的服务器,而您远离地理区域。当您位于服务器的地理区域并且您的设备连接到 wifi 时,您拍摄一张照片(例如),稍后您必须将其保存在该服务器上。 url 约束将确保如果 url 不可访问,则永远不会执行或刷新工作请求(设置为失败)。当 url 约束符合连接协议时,将执行工作请求。
使用 android-priority-job-queue V2
,我必须实现一个逻辑来检查 android-priority-job-queue V2
的 shouldReRunOnThrowable(Throwable throwable, int runCount,int maxRunCount)
抛出 http 异常并使用 Room Persistence Library. Then later, every time I detect a connectivity change status via the BroadCastReceiver 保存未发送的数据,我尝试重新发送未发送的数据并标记那些最终发送的数据(那些在 android-priority-job-queue V2
中完成了 onRun()
的数据)。稍后我将通过定期例程从数据库中刷新每个发送的数据。该解决方案有效。但是假设我想发送不同类型的数据(图片、位置等),我必须为每种不同类型的作业重写相同的例程。
我不知道如何用 WorkManager
做同样的事情。
有人可以帮助我,指出如果实现此功能我可能会错过的文档部分吗?或者至少是一种使用 WorkManager
.
来实现它的方法
P.S: WhisperSystems' JobManager, allowed me to add a custom url. Yet the problem was that its persistance didn't worked on some devices (some Samsung models). When I crashed the app, data were never recovered. I went on github for help, 无济于事。我不是在指责任何人,我只是想表明我一直在寻找解决方案。
我想我已经找到了一种方法,可以让它与 WorkManager
一起工作,并且它的工作效果达到了预期。
这些是使其工作的步骤:
1. 我将每个位置信息(包含其 URL 目的地)放在 OneTimeWorkRequest
中,并以 NetworkType.CONNECTED
作为约束,并且为重试设置退避策略(假设我将其设置为 10 分钟)。
2.在class扩展Worker
,在doWork()
:
a. ping服务器(你可以用你的后台设置)包围一个try/catch
b. 如果成功,您发送位置数据。在收到 http/https 请求的成功状态后,您 return WorkerResult.SUCCESS
c. 如果当您对服务器执行 ping 操作时出现异常或在发送位置数据时您没有收到 http 成功,则您 return 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;
}
我已经使用 android-priority-job-queue V2
两年了(很棒的图书馆)。 Android Workmanager
刚刚出现。我喜欢它的一点是它真的很容易设置,你不必与 JobScheduler
、Firebase
、JobDispatcher
或 AlarmManager
打架,它就完成了为了我们。使用 android-priority-job-queue V2
我不得不手动设置 FrameworkJobSchedulerService
/GcmJobSchedulerService
.
是否可以使用 Workmanager
添加某个 http url 作为约束?有时,您想要将一些数据发送到受保护的 wifi 中的服务器,而您远离地理区域。当您位于服务器的地理区域并且您的设备连接到 wifi 时,您拍摄一张照片(例如),稍后您必须将其保存在该服务器上。 url 约束将确保如果 url 不可访问,则永远不会执行或刷新工作请求(设置为失败)。当 url 约束符合连接协议时,将执行工作请求。
使用 android-priority-job-queue V2
,我必须实现一个逻辑来检查 android-priority-job-queue V2
的 shouldReRunOnThrowable(Throwable throwable, int runCount,int maxRunCount)
抛出 http 异常并使用 Room Persistence Library. Then later, every time I detect a connectivity change status via the BroadCastReceiver 保存未发送的数据,我尝试重新发送未发送的数据并标记那些最终发送的数据(那些在 android-priority-job-queue V2
中完成了 onRun()
的数据)。稍后我将通过定期例程从数据库中刷新每个发送的数据。该解决方案有效。但是假设我想发送不同类型的数据(图片、位置等),我必须为每种不同类型的作业重写相同的例程。
我不知道如何用 WorkManager
做同样的事情。
有人可以帮助我,指出如果实现此功能我可能会错过的文档部分吗?或者至少是一种使用 WorkManager
.
P.S: WhisperSystems' JobManager, allowed me to add a custom url. Yet the problem was that its persistance didn't worked on some devices (some Samsung models). When I crashed the app, data were never recovered. I went on github for help, 无济于事。我不是在指责任何人,我只是想表明我一直在寻找解决方案。
我想我已经找到了一种方法,可以让它与 WorkManager
一起工作,并且它的工作效果达到了预期。
这些是使其工作的步骤:
1. 我将每个位置信息(包含其 URL 目的地)放在 OneTimeWorkRequest
中,并以 NetworkType.CONNECTED
作为约束,并且为重试设置退避策略(假设我将其设置为 10 分钟)。
2.在class扩展Worker
,在doWork()
:
a. ping服务器(你可以用你的后台设置)包围一个try/catch
b. 如果成功,您发送位置数据。在收到 http/https 请求的成功状态后,您 return WorkerResult.SUCCESS
c. 如果当您对服务器执行 ping 操作时出现异常或在发送位置数据时您没有收到 http 成功,则您 return 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;
}