Android,使用dagger 2在整个应用程序中使用AppModule上下文

时间:2016-10-17 10:24:05

标签: android dependency-injection dagger-2

根据以下代码:

@Module
public class AppModule {
private Application application;

public AppModule(Application application) {
    this.application = application;
}

@Singleton
@Provides
Context providesContext() {
    return application;
  }

@Singleton
@Provides
IAppDbHelper providesAppDbHelper() {
    // a SQLiteOpenHelper class 
    return new AppDbHelper(application);
  }
}

AppComponent:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(MainActivity mainActivity);
void inject(SecondActivity secondActivity);
IAppDBHelper providesIAppDBHelper();
}

MainActivity:     公共类MainActivity扩展AppCompatActivity {     @注入     IAppDBHelper helper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ((MyApplication)getApplication()).getComponent()
            .inject(this);
    // It's OK
    helper.getWritable().execSQL("XXX");

    startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
}

SecondActivity:

public class SecondActivity extends AppCompatActivity {
@Inject
IAppDBHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    // nullPointer on helper
    helper.getWritable().execSQL("XXX");
}
}

inject AppComponent SecondActivity nullPointerinject错误修正后,我的问题是我必须AppComponent我的IAppDbHelper每次我想要注射@Singleton?那么MainActivity和注入IAppDbHelper内部的意思是什么?他们不应该为SecondActivity注入typedef struct A { int cost; } B 吗?

1 个答案:

答案 0 :(得分:1)

您需要获取组件并注入 Android创建的每个类。这通常意味着所有活动,碎片和视图。 Dagger无法创建这些类,因此Dagger了解外部创建的实例的唯一方法是将其传递给Component上的inject方法。

在注入期间,将提供MainActivity和SecondActivity上的所有@Inject字段,并且Dagger创建的任何实例也将注入其依赖项,依此类推。这意味着您通常不需要直接在外部创建的类之外使用Component,例如Activities和Fragments,或者(当然)您自己创建Component实例的Application实例。

@Singleton确实意味着MainActivity,SecondActivity以及Android在您为应用程序设置背景时可能创建的MainActivity或SecondActivity的任何未来实例之间的实例保持不变。但是,您仍然需要在Android创建它们时为这些类请求注入,以便接收您使用@Singleton保证的相同实例。