依存性注入のためにdagger2を実装しようとしています。以前は依存性注入に Roboguice を使用していましたが、RG3 に更新すると動作しなくなりました。注入されたビューはすべて null でした。だから私はDagger2を使おうとしています。dagger1 の経験はありません。
以下は、私が使用しようとしているクラスです。
@Module
public class NTMAModule {
NTMA app;
public NTMAModule(final NTMA app) {
this.app = app;
}
// EdgeConnection
@Provides
@Singleton
EdgeConnection provideEdgeConnection() {
return new EdgeConnection();
}
// MessageCenterConnection
@Provides
@Singleton
MessageCenterConnection provideMessageCenterConnection() {
return new MessageCenterConnection();
}
// ConnectionManager
@Provides
@Singleton
ConnectionManager provideConnectionManager() {
return new ConnectionManager();
}
// AccountManager
@Provides
@Singleton
AccountManager provideAccountManager(EdgeConnection connection) {
return new AccountManager(connection);
}
....
}
したがって、上記のモジュールでは、必要なすべてのオブジェクトをインスタンス化します。
以下は私のコンポーネントクラスです
@Singleton
@Component(modules = {NTMAModule.class})
public interface NTMAComponent {
ConnectionManager connectionManager();
EdgeConnection edgeConnection();
MessageCenterConnection messageCenterConnection();
AccountManager accountManager();
void inject(Order order);
void inject(Position pos);
void inject(GroupObject gp);
void inject(LoginFragment fragment);
void inject(ReconnectingFragment fragment);
void inject(EdgeConnection connection);
void inject(LoginActivity act);
void inject(BaseActivity act);
void inject(ConnectionManager cm);
void inject(MessageCenterManager mcm);
}
これは私のインジェクタークラスです
public enum Injector {
INSTANCE;
NTMAComponent applicationComponent;
Injector() {
}
void initializeInjector(NTMA application) {
NTMAComponent component = DaggerNTMAComponent.builder().nTMAModule(new NTMAModule(application)).build();
applicationComponent = component;
}
public NTMAComponent getComponent() {
return applicationComponent;
}
}
インジェクターは、アプリケーション クラス onCreate() で初期化されています。
次に、さまざまなアクティビティの onCreate と、ConnectionManager、AccountManager、EdgeConnection などのクラスの場合、コンストラクターで使用して、コンポーネントを使用してフィールド メンバーを注入します。
Injector.INSTANCE.getComponent().inject(this);
しかし、アプリケーションの起動時に、次のログを取得します...そして、それは続きます。その後、スタックオーバーフローが発生し、アプリがクラッシュします。何も表示されません。
01-04 15:30:36.761 12125-12125/? A/art: sart/runtime/runtime.cc:292]
at dagger.internal.ScopedProvider.get(ScopedProvider.java:46) 01-04 15:30:36.761 12125-12125/? A/art: sart/runtime/runtime.cc:292] - ロックされた <0x13515e62> (dagger.internal.ScopedProvider)