私はDagger2が新しく、アプリケーションに依存性注入を使用しようとしています。 私は共有環境設定を使用しています。使用するたびに共有環境設定のインスタンスを取得するのではなく、依存関係注入を使用すると便利です。 アクティビティやフラグメントで使用してもうまく動作しますが、サービスやインインテリジェンスで使用しようとしているときは機能しません。ここでAndroid Dagger2依存性注入
は私のコードです:
AppModule:
@Module
public class AppModule
{
public final ApplicationClass application;
public AppModule(ApplicationClass application)
{
this.application = application;
}
@Provides @Singleton
Context providesApplicationContext()
{
return this.application;
}
@Provides @Singleton
SharedPreferences providesSharedPreferences()
{
return application.getSharedPreferences(Constants.FILE_NAME,Context.MODE_PRIVATE);
}
}
AppComponent
@Singleton @Component(modules = {AppModule.class})
public interface AppComponent
{
void inject (ApplicationClass applicationClass);
void inject (IntentService intentService);
void inject (Service service);
}
ApplicationClass
public class ApplicationClass extends Application
{
AppComponent appComponent;
@Override
public void onCreate()
{
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(new
Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
onUncaughtException(t, e);
}
});
appComponent = DaggerAppComponent
.builder()
.appModule(new AppModule(this))
.build();
appComponent.inject(this);
}
public AppComponent getAppComponent()
{
return this.appComponent;
}
private void onUncaughtException(Thread t, Throwable e)
{
e.printStackTrace();
Intent crash= new Intent(getApplicationContext(),Crash.class);
about.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(crash);
}
}
は、だから私はIntentServiceで共有設定を注入しようとしたと私は私のサービスののonCreateメソッド内のコード のこれらの行を使用(intentservice)
@Inject
SharedPreferences preferences;
@Override
public void onCreate()
{
super.onCreate();
((ApplicationClass)getApplication()).getAppComponent().inject(this);
}
しかし、私は、この設定を使用するときに問題があります変数がonHandleIntent
メソッドでは、設定がnullであるためアプリケーションがクラッシュしています。 なぜそれが注入されないのですか?
IntentServiceにコンテキストと共有設定を注入する必要はありません。IntentServiceはすでにContextから継承しています。あなたの問題は、次のような場合に、appletのためにAppComponentのターゲットクラス(インジェクションメソッドの中で)に名前を使うべきです: 'void inject(ApplicationClass applicationClass); void inject(CustomIntentService intentService); void inject(SimpleIntentServiceサービス); ' – Onregs
**特定の具象クラス**を指定し、その親クラスではなく注入する必要があります。だからIntentServiceと言うだけでインテントサービスに注入することはできません。あなたのクラスはIntentServiceではなく、WhateverServiceです。 – EpicPandaForce
@ VadimKorzunありがとう、ありがとう、私は共有の設定を意味し、私の質問を編集しました。 私の問題についてのご理解ありがとう – Elior