WorkManager Java Android Dagger2

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


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


还有很多关于 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 或项目不生成。


繁花如伊
浏览 116回答 1
1回答

慕哥6287543

如您链接的文章中所述,您需要将WorkManager 的自定义配置与自定义 WorkerFactory 一起使用,将附加参数传递给您的 Worker 类: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 中),它创建了一个自定义配置并为需要用匕首注入额外参数的特定工作人员注册了一个 WorkerFactory。你可以在这个Plaid 分支上找到代码,Worker 和 WorkerFactory 在这里。要为您的具体案例提供更多指导,了解更多背景信息会很有帮助。我可以想象您已经在其他类中注入了 dbModel。您可以在注册自定义 WorkerFactory 时执行相同的操作,注入 dbModel,这样您就可以将其作为参数传递给 Worker 类。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java