android – 如何创建WorkerParameters
作者:互联网
工人的工人()是@Deprecated,所以需要使用
public Worker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
但是WorkerParameters的构造函数是@hide.
那么,如何创建WorkerParameters实例呢?
这个库是Android后台任务调度库的最新版本,但是这个库最近更新了API,以便将旧的创建方法标记为废弃的核心类
现在,我不知道如何创建这个核心类,因为其中一个参数没有公开构造函数,也没有找到Factory / Builder的工作方式
所以让我看看是否有人可以帮助我在伟大的Stack Overflower.
核心类是Worker,params是WorkerParameters
解决方法:
好的,所以查询你的是来自WorkManager的最新库版本(依赖:android.arch.work:work-runtime:1.0.0-alpha09),
Theres的构造函数改变了
工人()
至
Worker(@NonNull Context appContext,@ NonNull WorkerParameters workerParams).
这意味着默认构造函数现在不再有用(已弃用,标记为应在未来版本中删除)&我们现在在参数化构造函数上.
现在,如果您注意到我们使用Worker时,我们不是直接创建它的新对象,而是我们做这样的事情,
OneTimeWorkRequest.from(FooWorker.class) // We pass Class<?> obj of our worker here, or in PeriodicWorkRequest-it's the same
(将我们的Worker的类Object传递给WorkRequest)
这意味着WorkParameters是由内部的DefaultWorkerFactory提供的.因此,您不必担心它,因为我们不会自己创建Worker的新对象,除非您需要任何自定义设置(现在这个版本可以实现,并且它很好).
Also, from latest API changes on September 19, 2018
- You can now create your own
Worker
instances at runtime by specifying aWorkerFactory
as part of theWorkManager.Configuration
.
The fallback factory isDefaultWorkerFactory
, which matches behavior
of previous versions ofWorkManager
.- The default constructors for
Worker
andNonBlockingWorker
are now marked as deprecated. Please use the new constructor(Worker(Context, WorkerParameters))
and callsuper(Context, WorkerParameters);
future
versions ofWorkManager
will remove the default constructor.
所以现在,这就是这个问题的全部原因,如果我想创建WorkerParameters怎么办?
答案是,在创建WorkerParameters之前,您需要覆盖WorkManager库的默认行为并提供您自己的自定义WorkManager.Configuration&通过提供WorkerParameters,在运行时创建自己的Worker. (这是我们需要提供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的构造函数/对象.
我希望这个答案能满足你的问题和帮助.
标签:android,android-workmanager 来源: https://codeday.me/bug/20190622/1261841.html