【问题标题】:Run worker every time internet is available每次互联网可用时运行工作者
【发布时间】:2019-08-21 03:39:09
【问题描述】:

我正在开发一个 Android 应用程序,每次用户打开 Wi-Fi 或移动数据时,我都使用 Firebase JobDispatcher 库来运行后台作业,但不幸的是,该库已被弃用,现在新的 WorkerManager 是去吧。

我的问题是每次互联网可用时如何使用 WorkerManager 运行作业

我查看了 WorkerManager 库迁移指南和文档,但我无法使用 OneTimeWorkRequest 或 PeriodicWorkRequest 实现。

这是我使用 Firebase JobDispatcher 库实现该目标的代码。

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));

Job networkJob = dispatcher.newJobBuilder()
        .setService(NetworkJobService.class)
        .setTag(Const.NETWORK_JOB_TAG)
        .setReplaceCurrent(true)
        .setLifetime(Lifetime.FOREVER)
        .setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
        .setRecurring(true)
        .setTrigger(Trigger.executionWindow(0, 0))
        .setConstraints(Constraint.ON_ANY_NETWORK)
        .build();

    dispatcher.schedule(networkJob);

【问题讨论】:

  • 嗨@Waxren,无论使用 android-jobscheduler 还是 android-workmanager,您是否只想在互联网进入时触发监听器?
  • 是的,但即使应用程序已关闭且未运行

标签: java android android-jobscheduler android-workmanager jobservice


【解决方案1】:

WorkManager 的官方文档包含一个 migration guide,用于将应用程序从 Firebase JobDispatcher 转换为 WorkManager。

关键是 WorkManager 允许以与 Firebase JobDispatcher 类似的方式将 Constraints 设置为您的 WorkRequest

Constraints constraints = new Constraints.Builder()
    // The Worker needs Network connectivity
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .build();

PeriodicWorkRequest request =
    // Executes MyWorker every 15 minutes
    new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES)
        // Sets the input data for the ListenableWorker
        .setConstraints(constraints)
        .build();

当有连接时,这将每 15 分钟(最小间隔)执行一次您的工作人员。您需要考虑的另一个限制是 Worker 的运行时间不能超过 10 分钟。在该时间间隔之后,操作系统将停止您的 Worker。

这两个限制都来自 Android 框架中的底层 JobScheduler API。

【讨论】:

  • 考虑以下示例,用户打开 Wi-Fi,作业将执行,然后在 15 分钟间隔结束之前,用户关闭然后打开 Wi-Fi,作业将不会执行跨度>
  • 这就是我需要重复作业而不是定期作业的问题,换句话说,作业应该在设备连接到网络后运行一次,下一次运行不是在 15 分钟后(或任何特定间隔),但在设备再次连接之后。
  • Worker 只会在上一次执行的 15 分钟后执行。如果您需要在连接可用时立即执行它,考虑到 API 26+ 的隐式广播限制,我建议您使用带有侦听器的前台服务来进行连接。
  • 感谢您的评论。我认为这是库中缺少的功能,而不是使用前台服务。因为许多应用程序需要在连接可用时立即运行作业代码。
  • 恐怕库无法添加此支持,因为它只是使用系统中已有的(JobScheduler)并且它从您的应用程序进程中运行,具有相同的限制。如果您认为此功能很重要,您可以在 WorkManager 的公共问题跟踪器上打开功能请求:issuetracker.google.com/issues/…
【解决方案2】:

最好启动一次工作管理器并使用网络类型设置约束,检查是 Workmanager 的 doWork() 中可用的连接,而不是调用工作管理器 一次又一次。

 setConstraints(new Constraints.Builder()
                     .setRequiredNetworkType(NetworkType.CONNECTED)

试试这个解决方案

导入工作经理

https://developer.android.com/jetpack/androidx/releases/work

然后启动Worker

PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(WorkManagerDemo.class, 15, TimeUnit.MINUTES)
            .addTag("WorkManagerDemo").setConstraints(new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();
    WorkManager.getInstance().enqueueUniquePeriodicWork("WorkManagerDemo", ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);

WorkManagerDemo 类在哪里

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.annotation.NonNull;

import androidx.work.Worker;
import androidx.work.WorkerParameters;

public class WorkManagerDemo extends Worker {

    public WorkManagerDemo(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        //do your work here
        return Result.success();
    }


}

【讨论】:

  • WorkManager 包含仅当设备连接到网络时可用于运行工作程序的约束。您的方法在电池方面更具侵略性,并且没有考虑 Worker 的 10 分钟执行限制。一个 Worker,在 10 分钟后,会被操作系统自动停止。
  • 我反对使用非常过时的 WorkManager 版本和使用糟糕的网络检查实现(提示:您应该使用约束,不要使用 ConnectivityManager)
  • @pfmaggi 仅供参考 最短重复时间是 15 分钟而不是 10 分钟
  • 是的,最短重复时间为 15 分钟。但是我在这里写的 10 分钟是 Worker 的最长执行时间:如果您的 Worker 运行超过 10 分钟,操作系统将停止它。
  • 阅读更多关于工作经理的信息并使用它来确保它实际上是如何工作的......好吧,据我所知,工人不间断地跑 10 分钟是没有意义的......工作经理可能在打瞌睡模式下不工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
相关资源
最近更新 更多