Puisque la classe Worker
est créée par le framework (WorkerManager
), comment pouvons-nous utiliser les champs @ Inject dans les Worker
?
Vous devez fournir une classe en utilisant @Provides
annotation dans le module à injecter.
Créez d'abord un composant contenant un module qui fournira la classe.
@Component(modules = {Module.class})
public interface Component1{
void inject(SyncWorker syncWorker);
}
Classe de module
@Module
public class Module{
@Provides
public ISettingRepository getSettingRepo(){
return new ISettingRepository();
}
}
Maintenant, écrivez dans votre code, un constructeur qui est utilisé pour injecter le composant dans votre classe de travail.
public class SyncWorker extends Worker {
@Inject
ISettingRepository settingRepository;
public SyncWorker(){
DaggerComponent1.builder().build().inject();
}
@NonNull
@Override
public Result doWork() {
sync();
return Result.SUCCESS;
}
private void sync() {
}
}
J'utilise ces séries de messages pour implémenter la dague dans mon application et ProfileManager
est la classe que je veux utiliser pour inject
dans ma Worker
classe.
UploadWorker
public class UploadWorker extends Worker {
@Inject
ProfileManager profileManager;
@Inject
@SuppressWarnings("WeakerAccess")
public UploadWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
Provider.getAppComponent().inject(this);
}
@NonNull
@Override
public Result doWork() {
profileManager.someMethod();
}
}
Dans la classe Application , je configure Appcomponent
dans ma classe Provider
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
AppComponent appComponent = DaggerAppComponent.builder().application(this).build();
appComponent.inject(this);
Provider.setAppComponent(appComponent);
return appComponent;
}
Fournisseur
public class Provider {
private static AppComponent appComponent;
public static AppComponent getAppComponent() {
return appComponent;
}
public static void setAppComponent(AppComponent component) {
appComponent = component;
}
}
Composant de l'application
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
ActivityBuilderModule.class,
ApiModule.class,
AppModule.class,
ViewModelModule.class
})
public interface AppComponent extends AndroidInjector<DaggerApplication> {
@Override
void inject(DaggerApplication instance);
void inject(MyApplication app);
void inject(UploadWorker uploadWorker);
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
}