How to implement Dagger for worker classes?

后端 未结 2 2047
忘了有多久
忘了有多久 2020-12-18 20:27

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

相关标签:
2条回答
  • 2020-12-18 20:43

    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})
    public interface Component1{
    
        void inject(SyncWorker syncWorker);
    }
    

    Module Class

    @Module
    public class Module{
    
        @Provides
        public ISettingRepository getSettingRepo(){
            return new ISettingRepository();
        }
    
    }
    

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

    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() {
    
        }
    }
    
    0 讨论(0)
  • 2020-12-18 20:49

    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

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

    In Application class I am setting Appcomponent in my Provider class

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

    Provider

    public class Provider {
    
        private static AppComponent appComponent;
    
        public static AppComponent getAppComponent() {
            return appComponent;
        }
    
        public static void setAppComponent(AppComponent component) {
            appComponent = component;
        }
    
    }
    

    Appcomponent

    @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();
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题