如何创建WorkerParameters

时间:2018-09-20 09:55:20

标签: android android-workmanager

工人的Worker()@Deprecated,因此需要使用

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

但是WorkerParameters的构造函数是@hide

那么,如何创建WorkerParameters实例?


该库是Android后台任务调度库的最新版本,但该库最近更新了API,以将核心类的旧创建方法标记为已废弃

现在,我不知道如何创建此核心类,因为其中一个参数不会公开构造函数,也无法找到Factory / Builder的工作方式

所以,让我看看是否有人可以在我的Stack Overflower中帮助我。

核心类是Worker,参数是WorkerParameters

1 个答案:

答案 0 :(得分:5)

好的,因此您需要查询的是最新版本的 WorkManager (依赖项: android.arch.work:work-runtime:1.0.0 -alpha09

Theres的构造函数从

更改

Worker()

Worker(@NonNull Context appContext, @NonNull WorkerParameters workerParams)

这意味着默认构造函数现在不再有用(已弃用,标记为应在将来的版本中删除)&我们现在在parameterized constructor上。

现在,如果您已经注意到,当我们使用我们的 Worker 时,我们不是直接创建新的object,而是这样做,

OneTimeWorkRequest.from(FooWorker.class) // We pass Class<?> obj of our worker here, or in PeriodicWorkRequest-it's the same

(将我们的Worker的类对象传递给我们的WorkRequest

这意味着 WorkParameters DefaultWorkerFactory 内部提供的。因此,您不必担心,因为,除非您需要任何自定义的设置(现在是哪个),否则我们不会自己创建 Worker 的新对象。


  

此外,根据 2018年9月19日

的最新API更改      
      
  • 您现在可以在运行时通过将Worker指定为WorkerFactory的一部分来创建自己的WorkManager.Configuration实例。   后备工厂为DefaultWorkerFactory,与行为匹配   WorkManager的早期版本。
  •   
  • WorkerNonBlockingWorker的默认构造函数现已标记为已弃用。请使用新的构造函数(Worker(Context, WorkerParameters))并致电super(Context, WorkerParameters);   WorkManager版本将删除默认构造函数。
  •   

现在,这就是这个问题的全部原因,如果我要创建 WorkerParameters 怎么办?

答案是,在创建 WorkerParameters 之前,您需要覆盖WorkManager库的默认行为,并提供自己的自定义WorkManager.Configuration和通过在运行时提供Worker来创建自己的WorkerParameters(在这种情况下,我们需要提供 WorkerParameters ,如果您只是开箱即用地使用WorkManager功能,则可能不想这样做)


有一个GoogleCodeLab的example,它很好地解释了WorkManager(您可以看到here是如何用新的构造函数完成的。)

结论:

假设您有一个名为FooWorker Worker 类,那么您的代码将如下所示:

public class FooWorker extends Worker {
    public FooWorker(
            @NonNull Context appContext,
            @NonNull WorkerParameters workerParams) {
        super(appContext, workerParams);
    }

    private static final String TAG = FooWorker.class.getSimpleName();

    @NonNull
    @Override
    public Worker.Result doWork() {
        // Do some work & return appropriate result.
    }
}

并像这样初始化

//Init WorkManager
private WorkManager mWorkManager;
mWorkManager = WorkManager.getInstance();
// Enqueue our work to manager
mWorkManager.enqueue(OneTimeWorkRequest.from(FooWorker.class)); // Here, we're not creating new FooWorker(); & we don't need to worry about `WorkerParameters` for now.

因此,没有理由访问/创建WorkerParamters构造函数/对象

我希望这个答案能满足您的问题并有所帮助。