如何在 Dagger 2.16 中为 worker 类 实现 Dagger?('android.arch.work:work-runtime')
How to implement Dagger for worker classes in Dagger 2.16 ?('android.arch.work:work-runtime')
如何在 Dagger 2.16 中为 worker 类 实现 Dagger?
public class SyncWorker extends Worker {
@Inject
ISettingRepository settingRepository;
@NonNull
@Override
public Result doWork() {
sync();
return Result.SUCCESS;
}
private void sync() {
}
}
我的 AppComponent
@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?
要在 Dagger 2 中注入任何 classes,您必须首先在模块中使用 @provides
注释提供那些 classes。
您必须首先创建一个组件,其中包含一个提供所需 class 的模块。
示例:-
@component(modules = {Module1.class})
public interface Component1{
void inject(SyncWorker syncWorker);
}
@Module
public class Module1{
@Provides
public ISettingRepository getSettingRepo(){
return new ISettingRepository();
}
}
现在在您的代码中编写一个构造函数,用于将组件注入您的 worker class。
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。
首先,在您的应用程序组件中创建一个新方法,它将注入您的 worker class。
@Singleton
public interface AppComponent extends AndroidInjector<YourApplicationClass> {
@Component.Builder
interface Builder {
@BindsInstance
AppComponent.Builder application(Application application);
AppComponent build();
}
void inject(NotifWorker worker);
}
在您的应用程序中,像往常一样构建您的匕首组件,但将其分配给一个变量并使其成为全局变量。
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;
}
}
在你的 worker 里面 class,做这样的事情。
public class NotifWorker extends Worker {
@Inject
ToBeInjectedClass toBeInjectedClass;
public NotifWorker() {
YourApplicationClass
.getInstance()
.getAppComponent()
.inject(this)
}
}
如何在 Dagger 2.16 中为 worker 类 实现 Dagger?
public class SyncWorker extends Worker {
@Inject
ISettingRepository settingRepository;
@NonNull
@Override
public Result doWork() {
sync();
return Result.SUCCESS;
}
private void sync() {
}
}
我的 AppComponent
@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?
要在 Dagger 2 中注入任何 classes,您必须首先在模块中使用 @provides
注释提供那些 classes。
您必须首先创建一个组件,其中包含一个提供所需 class 的模块。
示例:-
@component(modules = {Module1.class})
public interface Component1{
void inject(SyncWorker syncWorker);
}
@Module
public class Module1{
@Provides
public ISettingRepository getSettingRepo(){
return new ISettingRepository();
}
}
现在在您的代码中编写一个构造函数,用于将组件注入您的 worker class。
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。
首先,在您的应用程序组件中创建一个新方法,它将注入您的 worker class。
@Singleton public interface AppComponent extends AndroidInjector<YourApplicationClass> { @Component.Builder interface Builder { @BindsInstance AppComponent.Builder application(Application application); AppComponent build(); } void inject(NotifWorker worker); }
在您的应用程序中,像往常一样构建您的匕首组件,但将其分配给一个变量并使其成为全局变量。
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; } }
在你的 worker 里面 class,做这样的事情。
public class NotifWorker extends Worker { @Inject ToBeInjectedClass toBeInjectedClass; public NotifWorker() { YourApplicationClass .getInstance() .getAppComponent() .inject(this) } }