这是我的代码,我基于互联网上的一些旧教程。在Dagger 2的主站点上确实应该有一些例子,我发现很难理解如何实现这一切。
要让这么简单的应用程序运行真的需要做很多工作。我有两个问题:
我是否需要在每个类中调用DaggerLoggerComponent,以获得像Logger类这样的组件?
另外,我如何才能使Logger类的范围成为单例?现在,每次单击按钮都会创建一个新的记录器实例。
可能我不理解一些基本概念,我之前只在Spring中使用过依赖注入,所有这些对我来说都很奇怪。
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init(){
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoggerComponent component = DaggerLoggerComponent.builder().loggerModule(new LoggerModule()).build();
component.getLogger().log("Hello!",MainActivity.this);
}
});
}
}
public class Logger {
private static int i = 0;
public Logger(){
i++;
}
public static int getI() {
return i;
}
public void log(String text, Context context){
Toast.makeText(context,text+" "+i,Toast.LENGTH_SHORT).show();
}
}
@Singleton
@Component(modules={LoggerModule.class})
public interface LoggerComponent {
Logger getLogger();
}
@Module
public class LoggerModule {
@Provides
@Singleton
Logger provideLogger(){
return new Logger();
}
}
答案 0 :(得分:2)
答案是
:
This is currently our Dagger2 architecture.
编辑:这是我们正在制作的应用程序中的Retrofit实际代码:
public class MainActivity extends AppCompatActivity {
@OnClick(R.id.button) //ButterKnife
public void onClickButton() {
logger.log("Hello!");
}
@Inject
Logger logger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Injector.INSTANCE.getApplicationComponent().inject(this);
ButterKnife.bind(this);
}
@Override
protected void onDestroy() {
ButterKnife.unbind(this);
super.onDestroy();
}
}
public class Logger {
private static int i = 0;
private CustomApplication customApplication;
public Logger(CustomApplication application) {
this.customApplication = application;
i++;
}
public static int getI() {
return i;
}
public void log(String text){
Toast.makeText(customApplication, text + " " + i,Toast.LENGTH_SHORT).show();
}
}
public interface LoggerComponent {
Logger logger();
}
@Module
public class ApplicationModule {
private CustomApplication customApplication;
public ApplicationModule(CustomApplication customApplication) {
this.customApplication = customApplication;
}
@Provides
public CustomApplication customApplication() {
return customApplication;
}
}
@Module
public class LoggerModule {
@Provides
@Singleton
Logger provideLogger(){
return new Logger();
}
}
@Singleton
@Component(modules={LoggerModule.class, ApplicationModule.class})
public interface ApplicationComponent extends LoggerComponent {
CustomApplication customApplication();
void inject(MainActivity mainActivity);
}
public class CustomApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Injector.INSTANCE.initializeApplicationComponent(this);
}
}
public enum Injector {
INSTANCE;
private ApplicationComponent applicationComponent;
public ApplicationComponent getApplicationComponent() {
return applicationComponent;
}
void initializeApplicationComponent(CustomApplication customApplication) {
this.applicationComponent = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(customApplication))
.build();
}
}
答案 1 :(得分:1)
我是否需要在每个类中调用DaggerLoggerComponent,以获得像Logger类这样的组件?
对于由系统创建的所有类(如应用程序,活动和服务)都是。但对于你自己的课程,你不需要那样。只需用@inject注释你的构造函数,dagger就会提供你的依赖项。
另外,我如何才能使Logger类的范围成为单例?对 现在每个按钮单击都会创建一个新的记录器实例。
您对单身人士的设置是正确的。但是你必须在创建活动(onCreate)之后初始化组件一次,以便让dagger注入所有字段。如果您不需要立即使用Logger对象,也可以使用延迟注入功能。
fadeTransition.setFromValue(0.99);
然后,您可以访问您的对象,而无需从组件中获取参考:
@Inject
Logger logger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LoggerComponent component = DaggerLoggerComponent.builder().loggerModule(new LoggerModule()).build();
component.inject(this);
init();
}
总结: 您必须在使用字段注入的所有类中初始化组件。
更新: 要进行实际注入,必须将inject()方法声明到组件中,dagger将自动实现它。此方法将负责提供使用@Inject注释的任何对象。