WorkManager自定义URL约束?

时间:2018-06-13 14:07:21

标签: android android-workmanager

我已经使用android-priority-job-queue V2 2年了(伟大的图书馆)。 Android Workmanager刚出现。我喜欢它的是它很容易设置,你不必与JobSchedulerFirebase JobDispatcherAlarmManager作斗争,它为我们做了。使用android-priority-job-queue V2我必须手动设置FrameworkJobSchedulerService / GcmJobSchedulerService

是否可以使用Workmanager添加某个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,但无济于事。我并没有指责任何人,我只是想表明我一直在寻找解决方案。

1 个答案:

答案 0 :(得分:0)

我想我已经找到一种使其与WorkManager一起使用的方法,并且可以正常使用。 这些是使其运行的步骤:

1。。我以OneTimeWorkRequest为约束,将每个位置信息(包含其URL目标)放在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;
}