3

我正在开发一个 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);
4

2 回答 2

2

WorkManager 的官方文档包括将应用程序从 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。

于 2019-08-21T07:19:28.760 回答
-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();
    }


}
于 2019-08-21T05:22:20.590 回答