WorkManager自定义URL约束?

问题描述 投票:1回答:1

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

是否有可能使用Workmanagerto添加某个http网址作为约束?有时,您希望将某些数据发送到受保护的WiFi中的服务器,并且您远离地理区域。当您在服务器的地理区域并且设备连接到wifi时,您可以稍后拍摄(例如)您必须保存在该服务器上的图片。 url约束将确保如果无法访问url,则永远不会执行工作请求,也不会刷新工作请求(设置为Failure)。当满足与连接一致的url约束时,将执行工作请求。

使用android-priority-job-queue V2,我必须实现一个逻辑,检查android-priority-job-queue V2shouldReRunOnThrowable(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,但无济于事。我并没有指责任何人,我只是想表明我一直在寻找解决方案。

android android-workmanager
1个回答
0
投票

我想我已经找到了一种方法来使它与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;
}
© www.soinside.com 2019 - 2024. All rights reserved.