1

私は短剣を使い始めたばかりで、シングルトン オブジェクトに関するいくつかの問題に遭遇しました。

したがって、シングルトンは次のようになります。

@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

しかし、上記の2行を使用して理解していることから、 MainActivity.class を既存のオブジェクトグラフに挿入しています

いいえ。依存関係を MainActivity に注入しています。あなたのモジュールは短剣モジュールと依存関係です:)最初にアプリケーションのonCreateメソッドで作成したMySingle、2回目は注入中に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));
    }
}

データベース、メモリ内、ファイル内など、リポジトリの実装はほとんどありません。その実装を作成し、モジュールを介してリポジトリ インターフェイスにバインドするだけで、アクティビティ コードに触れることはありません。短剣を使用すると、アクティビティだけでなく、任意のクラスに注入できます

于 2014-03-18T18:38:24.917 に答える