工人的Worker()
是@Deprecated
,因此需要使用
public Worker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
但是WorkerParameters的构造函数是@hide
。
那么,如何创建WorkerParameters实例?
该库是Android后台任务调度库的最新版本,但该库最近更新了API,以将核心类的旧创建方法标记为已废弃
现在,我不知道如何创建此核心类,因为其中一个参数不会公开构造函数,也无法找到Factory / Builder的工作方式
所以,让我看看是否有人可以在我的Stack Overflower中帮助我。
核心类是Worker,参数是WorkerParameters
答案 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
的早期版本。Worker
和NonBlockingWorker
的默认构造函数现已标记为已弃用。请使用新的构造函数(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
的构造函数/对象。
我希望这个答案能满足您的问题并有所帮助。