根据以下代码:
@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
nullPointer
内inject
错误修正后,我的问题是我必须AppComponent
我的IAppDbHelper
每次我想要注射@Singleton
?那么MainActivity
和注入IAppDbHelper
内部的意思是什么?他们不应该为SecondActivity
注入typedef struct A {
int cost;
} B
吗?
答案 0 :(得分:1)
您需要获取组件并注入 Android创建的每个类。这通常意味着所有活动,碎片和视图。 Dagger无法创建这些类,因此Dagger了解外部创建的实例的唯一方法是将其传递给Component上的inject
方法。
在注入期间,将提供MainActivity和SecondActivity上的所有@Inject
字段,并且Dagger创建的任何实例也将注入其依赖项,依此类推。这意味着您通常不需要直接在外部创建的类之外使用Component,例如Activities和Fragments,或者(当然)您自己创建Component实例的Application实例。
@Singleton
确实意味着MainActivity,SecondActivity以及Android在您为应用程序设置背景时可能创建的MainActivity或SecondActivity的任何未来实例之间的实例保持不变。但是,您仍然需要在Android创建它们时为这些类请求注入,以便接收您使用@Singleton
保证的相同实例。