【问题标题】:WorkManager Java Android Dagger2 [closed]WorkManager Java Android Dagger2 [关闭]
【发布时间】:2019-05-30 13:08:22
【问题描述】:

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

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

还有很多网络上的例子相互复制...(全部在 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 或项目未构建。

【问题讨论】:

    标签: java android dagger-2 android-workmanager


    【解决方案1】:

    如您链接的文章中所述,您需要使用带有自定义 WorkerFactory 的 WorkManager's custom configuration,该自定义 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 中),它创建一个自定义配置并为需要注入 dagger 的附加参数的特定工作人员注册一个 WorkerFactory。

    你可以在这个Plaid branch上找到代码,Worker和WorkerFactory是here。要为您的具体案例提供更多指导,了解更多背景信息会很有帮助。我可以想象您已经在其他类中注入了 dbModel。

    您可以在注册自定义 WorkerFactory 时执行相同操作,注入 dbModel,然后将其作为参数传递给 Worker 类。

    【讨论】:

    • 我会试试 - 回复,谢谢! (Ps. 为什么人们会忽略这个不明显的问题 O_o)
    • 谢谢!收到您的回复后,我已经完成了!
    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2012-03-06
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多