Skip to content Skip to sidebar Skip to footer

How To Implement Dagger For Worker Classes?

Since the Worker class is created by the framework (WorkerManager), how can we use @Inject fields into the Worker?

Solution 1:

You have to provide class using @Provides annotation in the module to inject.

First create a component containing a module which will provide the class.

@Component(modules = {Module.class})publicinterfaceComponent1{

    voidinject(SyncWorker syncWorker);
}

Module Class

@ModulepublicclassModule{

    @Providespublic ISettingRepository getSettingRepo(){
        returnnewISettingRepository();
    }

}

Now write in your code, a constructor that is used to inject the component into your worker class.

publicclassSyncWorkerextendsWorker {

    @Inject
    ISettingRepository settingRepository;

    publicSyncWorker(){
        DaggerComponent1.builder().build().inject();
    }

    @NonNull@Overridepublic Result doWork() {

        sync();
        return Result.SUCCESS;
    }

    privatevoidsync() {

    }
}

Solution 2:

I am using these series of post for implementing dagger in my app and ProfileManager is the class I wnat to inject in my Worker class.

UploadWorker

publicclassUploadWorkerextendsWorker {

    @Inject
    ProfileManager profileManager;

    @Inject@SuppressWarnings("WeakerAccess")
    public UploadWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
     Provider.getAppComponent().inject(this);
    }

    @NonNull
    @OverridepublicResultdoWork() {
     profileManager.someMethod();
    }

}

In Application class I am setting Appcomponent in my Provider class

@Overrideprotected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        AppComponent appComponent = DaggerAppComponent.builder().application(this).build();
        appComponent.inject(this);
        Provider.setAppComponent(appComponent);
        return appComponent;
    }

Provider

publicclassProvider {

    privatestaticAppComponent appComponent;

    publicstaticAppComponentgetAppComponent() {
        return appComponent;
    }

    publicstaticvoidsetAppComponent(AppComponent component) {
        appComponent = component;
    }

}

Appcomponent

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        ActivityBuilderModule.class,
        ApiModule.class,
        AppModule.class,
        ViewModelModule.class
})
publicinterfaceAppComponentextendsAndroidInjector<DaggerApplication> {

    @Override
    voidinject(DaggerApplication instance);

    voidinject(MyApplication app);

    voidinject(UploadWorker uploadWorker);

    @Component.Builder
    interfaceBuilder {
        @BindsInstance
        Builder application(Application application);

        AppComponent build();
    }

}

Post a Comment for "How To Implement Dagger For Worker Classes?"