【问题标题】:How to implement Dagger for worker classes in Dagger 2.16 ?('android.arch.work:work-runtime')如何在 Dagger 2.16 中为工作类实现 Dagger?('android.arch.work:work-runtime')
【发布时间】:2018-07-11 07:24:45
【问题描述】:

如何在 Dagger 2.16 中为工人类实现 Dagger?

public class SyncWorker extends  Worker {

    @Inject
    ISettingRepository settingRepository;

    @NonNull
    @Override
    public Result doWork() {

        sync();
        return Result.SUCCESS;
    }

    private void sync() {

    }
}

我的应用组件

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        BaseModule.class,
        ApiModule.class,
        UserDatabaseModule.class,
        SaleDatabaseModule.class,
        AppModule.class,
        ActivityBuilderModule.class
})
public interface AppComponent extends AndroidInjector<DaggerApplication> {
    void inject(BaseApp app);

    @Override
    void inject(DaggerApplication application);

    @Component.Builder
    interface Builder {
        @BindsInstance

        Builder getApp(Application application);

        AppComponent build();
    }

}

如何注入 settingRepository?

【问题讨论】:

    标签: java android dependency-injection dagger-2 android-workmanager


    【解决方案1】:

    我能够用这种方法注入一个工人。

    1. 首先,在您的应用组件中创建一个新方法,该方法将注入您的工作类。

      @Singleton
      public interface AppComponent extends AndroidInjector<YourApplicationClass> {
      
          @Component.Builder
          interface Builder {
      
              @BindsInstance
              AppComponent.Builder application(Application application);
      
              AppComponent build();
          }
      
          void inject(NotifWorker worker);
      }      
      
    2. 在您的应用程序中,像往常一样构建您的匕首组件,但将其分配给一个变量并使其成为全局变量。

      public class YourApplicationClass implements HasActivityInjector {
      
        private AppComponent appComponent;
        @Override
        public void onCreate() {
            super.onCreate();
      
            appComponent = DaggerAppComponent.builder()
                    .application(this)
                    .build();
      
            appComponent.inject(this);
        }
      
        public AppComponent getAppComponent() {
            return appComponent;
        }
      }
      
    3. 在你的工人阶级中,做这样的事情。

      public class NotifWorker extends Worker {
      
        @Inject
        ToBeInjectedClass toBeInjectedClass;
      
        public NotifWorker() {
          YourApplicationClass
              .getInstance()
              .getAppComponent()
              .inject(this)
        }
      }
      

    【讨论】:

    • 别这样,至少用getApplicationContext()
    【解决方案2】:

    要在 Dagger 2 中注入任何类,您必须首先在模块中使用 @provides 注释提供这些类。

    您必须首先创建一个包含提供所需类的模块的组件。

    例子:-

    @component(modules = {Module1.class})
    public interface Component1{
    
    void inject(SyncWorker syncWorker);
    }
    
    @Module
    public class Module1{
    
    @Provides
    public ISettingRepository getSettingRepo(){
      return new ISettingRepository();
    }
    
    }
    

    现在在您的代码中编写一个构造函数,用于将组件注入您的工作类。

    public class SyncWorker extends  Worker {
    
        @Inject
        ISettingRepository settingRepository;
    
        public SyncWorker(){
           DaggerComponent1.builder().build().inject(this);
         }
    
        @NonNull
        @Override
        public Result doWork() {
    
            sync();
            return Result.SUCCESS;
        }
    
        private void sync() {
    
        }
    }
    

    现在,当构造函数运行时,您的 settingRepository 实例将被初始化。

    【讨论】:

    • 我更改了问题的文字。
    • 在我的情况下,承包商没有在我的 Worker 中工作,我将注射器放在 doWork 中,这很好
    猜你喜欢
    • 2021-09-14
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多