如何创建WorkerParameters

K.C*_*Cai 5 android android-workmanager

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

public Worker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }
Run Code Online (Sandbox Code Playgroud)

但WorkerParameters的构造函数是@hide

那么,如何创建WorkerParameters实例呢?


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

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

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

核心课程是工人?params是WorkerParameters

Jee*_*ede 5

好的,您需要查询的是最新版本的(dependency:android.arch.work : work-runtime : 1.0.0-alpha09)的库WorkManager

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
Run Code Online (Sandbox Code Playgroud)

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

这意味着这WorkParametersDefaultWorkerFactory内部提供的。因此,您不必担心,因为,Worker除非您需要任何自定义的设置,否则我们将不会自己创建新对象(此版本现在可以实现这一点,这很好)


此外,根据20189月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的例子,它很好地解释了WorkManager(您可以在这里看到如何使用新的构造函数来完成)。

结论:

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

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样初始化

//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.
Run Code Online (Sandbox Code Playgroud)

因此,有任何情况下访问/创建构造函数/对象WorkerParamters

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