1

我刚开始使用 dagger 并遇到了单例对象的一些问题。

所以单例看起来像这样:-

@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();
}
}

创建对象图的应用程序类:-

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");
}
 }

因此,每当我运行此程序时,单例“MySingle”的实例数为 1 ,这很好。但是,当我取消注释这些行时:-

MyApplication app=(MyApplication)getApplication();
app.getObjectGraph().inject(this);

我得到的实例数为 2。我从这里了解到 Dagger 为每个对象图创建一个单例,但是根据我使用上述 2 行的理解,我将 MainActivity.class 注入现有的对象图中,显然是使用到目前为止,这对我来说并不明显..我只是在试验它。

4

2 回答 2

2

但是根据我使用上述两行的理解,我将 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));
    }
}

您可以有很少的存储库实现:使用数据库,在内存中,在文件中,您只能创建它的实现并通过模块将其绑定到存储库接口,而无需触及 Activity 代码!使用匕首,您可以注入任何类,而不仅仅是 Activity

于 2014-03-18T18:38:24.917 回答
0

MySingle 不应该是 @Module 本身。您正在使用 new MySingle() 自己创建模块,然后从ObjectGraph中获取 MySingle 实例,就像您的 @Provides 方法所说的那样,它也正在调用 new MyModule。

于 2014-03-14T18:24:33.580 回答