如何创建 WorkerParameters

How can create WorkerParameters

工人的 Worker()@Deprecated ,所以需要使用

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

但是 WorkerParameters 的构造函数是 @hide.

那么,如何创建 WorkerParameters 实例?


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

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

所以让我看看有没有人可以在伟大的 Stack Overflower 中帮助我。

核心class是Worker,params是WorkerParameters

好的,所以向您查询的是 WorkManager (dependency : 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 的 class 对象传递给我们的 WorkRequest

这意味着WorkParametersDefaultWorkerFactory内部提供的东西。所以你不必担心,因为我们不会自己创建 Worker 的新对象,除非你想要任何自定义设置 (这个版本现在可以实现并且很好).


Also, from latest API changes on September 19, 2018

  • You can now create your own Worker instances at runtime by specifying a WorkerFactory as part of the WorkManager.Configuration. The fallback factory is DefaultWorkerFactory, which matches behavior of previous versions of WorkManager.
  • The default constructors for Worker and NonBlockingWorker are now marked as deprecated. Please use the new constructor (Worker(Context, WorkerParameters)) and call super(Context, WorkerParameters); future versions of WorkManager will remove the default constructor.

所以现在,这就是这个问题的全部原因,如果我想创建 WorkerParameters?

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


有 GoogleCodeLab 的 example which beautifully explains WorkManager (You can see here 它是如何使用新的构造函数完成的)。

结论:

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

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.

所以 access/create constructor/object 不存在 WorkerParamters.

希望这个回答能解决您的问题并对您有所帮助。