web-dev-qa-db-fra.com

Comment implémenter Dagger pour les classes de travailleurs?

Puisque la classe Worker est créée par le framework (WorkerManager), comment pouvons-nous utiliser les champs @ Inject dans les Worker?

18

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() {

    }
}
9
Anisuzzaman Babla

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();
    }

}
2
Levon Petrosyan