其他分享
首页 > 其他分享> > android – 如何创建WorkerParameters

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 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精美地解释了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