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?"