WorkManager Java Android Dagger2

WorkManager Java Android Dagger2

我需要在 Android 应用程序中使用 Workmanager,只有 JAVA(没有 Kotlin!!!)。 在一个项目中,我们只使用 dagger2.8(没有 android-dagger!),我需要注入或访问一些注入的 类,例如数据库。 (它注入了 AppComponent)。

已经尝试过: https://proandroiddev.com/dagger-2-setup-with-workmanager-a-complete-step-by-step-guild-bb9f474bde37 在 kotlin 中并在 Java 中重写。 - 在项目中不起作用。 (以及 Whosebug 上的所有关闭标题)

还有很多关于 web 的例子相互复制......(它们都是 Kotlin 的......)

我将所有库更新为实际版本,从 3.2.1 更新到 3.4.1,包含所有内容。

使用:AS 3.4.1 | gp:3.4.1 | gv:5.1.1 库:Dagger2、Retrofit2、OkHttp、Gson、ButterKnife、RxJava2、Room、Rabbit、WorkManager。它在 28 sdk 上 有我的工人:

private String TAG = getClass().getSimpleName();

DBModel dbModel; // this is injected room model in appComponent

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

@NonNull
@Override
public Result doWork() {
    Log.d(TAG, dbModel.toString()); // here is null
    return Result.success();

我在同一个组件中尝试过,然后分开。它不会起作用。为 null 或项目未生成。

如您链接的文章中所述,您需要将 WorkManager's custom configuration 与自定义 WorkerFactory 一起使用,将附加参数传递给您的 Worker class:

public class UIUpdaterWorker extends Worker {
    private String TAG = getClass().getSimpleName();

    public UIUpdaterWorker(
            @NonNull Context context,
            @NonNull WorkerParameters workerParams,
            @NonNull DBModel dbModel
    ) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        Log.d(TAG, dbModel.toString());
        return Result.success();
    }
}

然后您可以用 Dagger 注入它(DBModel 在您的情况下)。

我喜欢 WorkManager 2.1.0-alpha02 中添加的新“DelegatingWorkerFactory”功能(或者您可以自己采用类似的设计)。我制作了一个 PoC(在 Kotlin 中),它创建了一个自定义配置并为需要用 dagger 注入额外参数的特定工作人员注册了一个 WorkerFactory。

您可以在 Plaid branch, Worker and WorkerFactory are here 上找到代码。要为您的具体案例提供更多指导,了解更多背景信息会很有帮助。我可以想象您已经在其他 classes.

中注入了 dbModel

您可以在注册自定义 WorkerFactory 时执行相同的操作,注入 dbModel,这样您就可以将其作为参数传递给 Worker class。