我刚刚开始使用匕首并遇到了一些单身对象的问题。
所以Singleton看起来像这样: -
@Module(
injects = {MainActivity.class,SecondActivity.class}
)
public class MySingle {
//just to count the number of instances of the class
public static int thecount=0;
//the constructor
public MySingle(){
Log.v("testing","created");
thecount++;
}
@Singleton
@Provides
public MySingle getSingle(){
return new MySingle();
}
}
创建对象图的Application类: -
public class MyApplication extends Application {
private ObjectGraph objectGraph;
@Override
public void onCreate(){
super.onCreate();
objectGraph=ObjectGraph.create(new MySingle());
}
public ObjectGraph getObjectGraph(){
return objectGraph;
}
}
MainActivity.class: -
public class MainActivity extends ActionBarActivity {
@Inject MySingle mysingle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// MyApplication app=(MyApplication)getApplication();
// app.getObjectGraph().inject(this);
Log.v("testing", mysingle.thecount + " mainact");
}
}
所以,每当我运行它时,单身人员的实例数量为#34; MySingle"是1,这很好。但是,当我取消注释这些行时: -
MyApplication app=(MyApplication)getApplication();
app.getObjectGraph().inject(this);
我得到的实例数为2.我从here了解到Dagger为每个对象图创建了一个单例,但是根据我的理解,通过使用上面的两行,我将MainActivity.class注入到现有的对象图,显然我现在对它的使用并不明显。我只是在尝试它。
答案 0 :(得分:1)
但是根据我的理解,使用上面两行,我将MainActivity.class注入到现有的对象图中
没有。您正在向MainActivity注入依赖项。你的模块是dagger模块和依赖项一次:)你在Application onCreate方法中创建的第一个MySingle,第二次在注入期间创建MySingle。
@Module注释应该在提供依赖关系的类上,您应该在那里提供依赖关系。例如:
@Module(
injects = {MainActivity.class,SecondActivity.class}
)
public class DependencyModule {
@Singleton
@Provides
public Repository getSingle(){
return new InMemoryRepository();
}
}
一些界面:
public interface Repository {
List<String> getAllStrings();
}
其实施:
public class InMemoryRepository implements Repository {
@Override
List<String> getAllStrings() {
// you can create this list as static list in constructor if you are not sure that it is really singleton :)
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");
return list;
}
}
你的活动:
public class MainActivity extends ActionBarActivity {
@Inject Repository myRepository;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyApplication app=(MyApplication)getApplication();
app.getObjectGraph().inject(this);
Log.v("testing", repository.getAllString().get(0));
}
}
您可以拥有很少的存储库实现:使用数据库,在内存中,在文件中,您只能通过模块创建其实现并将其绑定到Repository接口,而无需触及Activity代码!使用匕首,您可以注入任何课程,而不仅仅是活动
答案 1 :(得分:0)
MySingle不应该是@Module本身。您正在使用新的MySingle()自己创建模块,然后从 ObjectGraph 获取MySingle实例,它喜欢您的@Provides方法,也称为新的MyModule。