2017-08-11 29 views
0

私は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であるためアプリケーションがクラッシュしています。 なぜそれが注入されないのですか?

+1

IntentServiceにコンテキストと共有設定を注入する必要はありません。IntentServiceはすでにContextから継承しています。あなたの問題は、次のような場合に、appletのためにAppComponentのターゲットクラス(インジェクションメソッドの中で)に名前を使うべきです: 'void inject(ApplicationClass applicationClass); void inject(CustomIntentService intentService); void inject(SimpleIntentServiceサービス); ' – Onregs

+1

**特定の具象クラス**を指定し、その親クラスではなく注入する必要があります。だからIntentServiceと言うだけでインテントサービスに注入することはできません。あなたのクラスはIntentServiceではなく、WhateverServiceです。 – EpicPandaForce

+0

@ VadimKorzunありがとう、ありがとう、私は共有の設定を意味し、私の質問を編集しました。 私の問題についてのご理解ありがとう – Elior

答えて

0

この問題が発生した場合は、 上記のコメントでVadim KorzunとEpicPandaForceが言及したように、 私は注入メソッドで特定のクラスを指定する必要があります。

だから私の場合は私のIntentServiceクラスがGeofenceService

名付けられたとAppComponentインターフェイス内で私がService

UPDATEため

void inject (GeofenceService service); 

同じことを書く必要があります。だから、

複数のサービスを持つすべての人IntentServiceから継承し、特定のサービスごとにinjectメソッドを書くことから自分自身を救いたい は、私は、以下の手順を行うことをお勧めします:

  1. があなたのAppComponentインタフェースでIntentService
  2. を拡張することBasicIntentServiceを作成し、パラメータとしてあなたBasicIntentServiceを取るジェクトメソッドを追加します。
  3. BasicIntentSeriveには、Inject注釈で注釈されたprotected SharedPrefrences変数があります。あなたはこのコード行を呼び出しますonCreateメソッド内でごBasicIntentServiceでまだ
  4. ((ApplicationClass)getApplication())getAppComponent()(これ)を注入します。。。

  5. は今、あなたは意志を作成し、各IntentServiceBasicIntentServiceを拡張し、あなたはSharedPreferences変数を使用することができます。


AppComponent:

@Singleton @Component(modules = {AppModule.class}) 
public interface AppComponent 
{ 
    void inject (YourApplicationClass applicationClass); 
    void inject (BasicIntentService intentService); 
} 

BasicIntentService

public class BasicIntentService extends IntentService 
{ 
    @Inject 
    protected SharedPreferences sharedPreferences; 

    @Override 
    public void onCreate() 
    { 
     super.onCreate() 
     ((YourApplicationClass)getApplication()).getAppComponenet().inject(this); 
    } 
} 

SomeIntentService

public class SomeIntentService extends BasicIntentService 
{ 
    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
    } 
    ----------- 
    @Override 
    protected void onHandleIntent(@Nullable Intent intent) 
    { 
    // some code 
    if (sharedPreferences.contains(someKey)) 
    { 
     // some code 
    } 
    else 
    { 
     // some code 
    } 
    } 

}