Android,使用 Dagger 2 在整个应用程序中使用 AppModule 上下文
Android, Using AppModule context at whole the app using 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);
}
}
应用程序组件:
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(MainActivity mainActivity);
void inject(SecondActivity secondActivity);
IAppDBHelper providesIAppDBHelper();
}
主要活动:
public class MainActivity 扩展 AppCompatActivity {
@注入
IAppDBHelper 助手;
@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));
}
}
第二个活动:
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");
}
}
在我的 SecondActivity
中 inject
ing 我的 AppComponent
之后,nullPointer
错误修复但我的问题是我必须 inject
我的 AppComponent
每次我想注入 IAppDbHelper
?那么 @Singleton
和 inject in inside my MainActivity
是什么意思呢?他们不应该为我的 SecondActivity
注入那个 IAppDbHelper
吗?
您需要获取您的组件并注入 每个 class Android 创建。这通常意味着所有活动、片段和视图。 Dagger 无法创建那些 classes,因此 Dagger 知道外部创建的实例的唯一方法是将其传递到组件的 inject
方法中。
在注入期间,将提供 MainActivity 和 SecondActivity 上的所有 @Inject
字段,并且 Dagger 创建的任何实例也将注入其依赖项,依此类推。这意味着您通常不需要直接在外部创建的 class 之外的组件,例如 Activities 和 Fragments,或者(当然)您创建组件实例本身的应用程序实例。
@Singleton
确实意味着 MainActivity、SecondActivity 以及 Android 可能在您后台应用程序时创建的 MainActivity 或 SecondActivity 的任何未来实例之间的实例将保持相同。但是,您仍然需要为那些 class 请求注入,因为 Android 创建它们,以便接收您用 [= 保证的相同实例12=].
根据下面的代码:
@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);
}
}
应用程序组件:
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(MainActivity mainActivity);
void inject(SecondActivity secondActivity);
IAppDBHelper providesIAppDBHelper();
}
主要活动: public class MainActivity 扩展 AppCompatActivity { @注入 IAppDBHelper 助手;
@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));
}
}
第二个活动:
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");
}
}
在我的 SecondActivity
中 inject
ing 我的 AppComponent
之后,nullPointer
错误修复但我的问题是我必须 inject
我的 AppComponent
每次我想注入 IAppDbHelper
?那么 @Singleton
和 inject in inside my MainActivity
是什么意思呢?他们不应该为我的 SecondActivity
注入那个 IAppDbHelper
吗?
您需要获取您的组件并注入 每个 class Android 创建。这通常意味着所有活动、片段和视图。 Dagger 无法创建那些 classes,因此 Dagger 知道外部创建的实例的唯一方法是将其传递到组件的 inject
方法中。
在注入期间,将提供 MainActivity 和 SecondActivity 上的所有 @Inject
字段,并且 Dagger 创建的任何实例也将注入其依赖项,依此类推。这意味着您通常不需要直接在外部创建的 class 之外的组件,例如 Activities 和 Fragments,或者(当然)您创建组件实例本身的应用程序实例。
@Singleton
确实意味着 MainActivity、SecondActivity 以及 Android 可能在您后台应用程序时创建的 MainActivity 或 SecondActivity 的任何未来实例之间的实例将保持相同。但是,您仍然需要为那些 class 请求注入,因为 Android 创建它们,以便接收您用 [= 保证的相同实例12=].