【发布时间】:2017-12-27 11:29:41
【问题描述】:
我在我的项目中使用 Dagger2 发布的库。我已将 AppComponent 定义为:
@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会定义具体的activity和相关模块为:
@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 等的依赖项。AppModule 定义为:
@Module
public class AppModule {
@Provides
@Singleton
TraderRepository provideIssueRepository(TraderListRepositoryImpl repository) {
return repository;
}
@Provides
@Singleton
SharedPreferences providesSharedPreferences(Application application) {
return PreferenceManager.getDefaultSharedPreferences(application);
}
}
**更新_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
{
}
}
}
它不允许我们注入,即使我尝试在应用程序类中实现 HasServiceInjector。它抛出: '不能在没有@Provide 或@Produce 的情况下注入服务'。
**Update_1 到此结束..
如何使用 Dagger2.11 版本注入 Intent 服务。我尝试定义:
void inject(IntentService intentService);
在 AppComponent 内部,但在注入依赖项时我仍然得到 NULL 值。
**Update_2:
我尝试在 Service 类中注入的 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 到此结束..
这里有任何帮助..
谢谢。
【问题讨论】:
-
你能告诉我们 IntentService 吗?您在哪里调用了您向我们展示的
inject方法,您是否考虑过using@ContributesAndroidInjectorto inject the Service? -
@JeffBowman 请检查 *Update_1 编辑。谢谢。