如何在Dagger2.11中注入IntentService
我在我的项目中使用了Dagger2发布的库。我已经定义AppComponent为:如何在Dagger2.11中注入IntentService
@Singleton @Component(modules = {
AndroidInjectionModule.class, AppModule.class, ActivityBuilder.class })
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(TraderApplication traderApplication);
}
然后ActivityBuilder将确定具体的活动及相关模块为:
@Module public abstract class ActivityBuilder {
@ContributesAndroidInjector(modules = SplashActivityModule.class)
abstract SplashActivity bindSplashActivity();
}
和SplashActivityModule是提供依赖关系:
@Module public class SplashActivityModule {
@Provides
SplashViewModel provideLoginViewModel(TraderRepository traderRepository, Application application, SharedPreferenceUtils sharedPreferenceUtils, AppExecutors appExecutors) {
return new SplashViewModel(traderRepository, application, sharedPreferenceUtils, appExecutors);
}
}
现在,我打电话一个来自SplashActivity的IntentService(用于加载一些设置数据),但在IntentService中,我无法处理@Inject SharePreference,AppExecuters等的依赖关系.AppM odule被定义为:
@Module public class AppModule {
@Provides
@Singleton
TraderRepository provideIssueRepository(TraderListRepositoryImpl repository) {
return repository;
}
@Provides
@Singleton
SharedPreferences providesSharedPreferences(Application application) {
return PreferenceManager.getDefaultSharedPreferences(application);
}
}
** Update_1: 和内部SetupDataService我试图注入喜欢里面的onCreate:
public class SetupDataService extends IntentService implements HasServiceInjector { @Inject
SharedPreferenceUtils mSharedPreferenceUtils;
@Inject
AndroidInjector<Service> fragmentDispatchingAndroidInjector;
@Override
public AndroidInjector<Service> serviceInjector() {
return fragmentDispatchingAndroidInjector;
}
@Override
public void onCreate() {
AndroidInjection.inject(this);
super.onCreate();
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
assert intent != null;
//**update_2 :
if(mSharedPreferenceUtils != null) //still null here after using @binds
{
}
}
}
它不允许我们注入,即使我试着在Application Class中实现HasServiceInjector。它抛出: '不能注入服务没有@Provide或@Produce'。
** Update_1到此为止..
如何使用Dagger2.11释放注入意向的服务。我试图定义:
void inject(IntentService intentService);
里面的AppComponent,但仍然,我注入依赖项时获得NULL值。
** Update_2:
和SharedPreferenceUtils类我试图在服务类注入内onHandleIntent返回null:
@Singleton public class SharedPreferenceUtils {
//region Private Fields
private SharedPreferences mSharedPreferences;
private final String TAG = SharedPreferenceUtils.class.getSimpleName();
private final Method APPLY_METHOD = findApplyMethod();
//endregion
@Inject
public SharedPreferenceUtils(SharedPreferences mSharedPreferences) {
this.mSharedPreferences = mSharedPreferences;
}
}
** Update_2到此为止..
任何帮助这里..
谢谢。
回答:
即使我试图在应用程序类中实现HasServiceInjector。它抛出:'不能注入服务没有@Provide或@Produce'。
这里要做的正确的事情就是要做到这一点:让您的应用程序实现HasServiceInjector。 AndroidInjection.inject()
的要点在于你正在接收Android创建的对象,因此无法自然访问DI图,并自动将应用程序转换为HasServiceInjector,以便尝试注入服务。见AndroidInjection(添加注释)的实现:
public static void inject(Service service) { checkNotNull(service, "service");
Application application = service.getApplication();
// Don't even bother checking the service itself, just check the Application.
if (!(application instanceof HasServiceInjector)) {
throw new RuntimeException(
String.format(
"%s does not implement %s",
application.getClass().getCanonicalName(),
HasServiceInjector.class.getCanonicalName()));
}
// As long as serviceInjector() returns non-null...
AndroidInjector<Service> serviceInjector =
((HasServiceInjector) application).serviceInjector();
checkNotNull(serviceInjector, "%s.serviceInjector() returned null",
application.getClass());
// ...ask it to inject your service.
serviceInjector.inject(service);
}
这听起来像你真正的问题是,你试图注入服务,这是不允许的:你可以注入SetupDataService,但还没有一个结合存在Service或IntentService。你可以自行添加到您安装在@ContributesAndroidInjector
您SetupDataService
结合模块:
@ContributesAndroidInjector(modules = SetupDataServiceModule.class) SetupDataService bindSetupDataService();
@Module interface SetupDataServiceModule {
@Binds Service bindService(SetupDataService service);
@Binds IntentService bindIntentService(SetupDataService service);
}
...但是,除非你正在编写可重用的代码应该多个服务工作,或者除非你有构建图谱限制并试图避免在其他代码段中直接引用您的SetupDataService,您可能希望只是坚持注入SetupDataService。
多一点背景,包括为什么你要在这里为服务而不是片段做到这一点见this answer from yesterday。
以上是 如何在Dagger2.11中注入IntentService 的全部内容, 来源链接: utcz.com/qa/264623.html