【问题标题】:Android, Using AppModule context at whole the app using dagger 2Android,使用 dagger 2 在整个应用程序中使用 AppModule 上下文
【发布时间】:2016-10-17 10:24:05
【问题描述】:

根据下面的代码:

@Module
public class AppModule {
private Application application;

public AppModule(Application application) {
    this.application = application;
}

@Singleton
@Provides
Context providesContext() {
    return application;
  }

@Singleton
@Provides
IAppDbHelper providesAppDbHelper() {
    // a SQLiteOpenHelper class 
    return new AppDbHelper(application);
  }
}

应用组件:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(MainActivity mainActivity);
void inject(SecondActivity secondActivity);
IAppDBHelper providesIAppDBHelper();
}

主要活动: 公共类 MainActivity 扩展 AppCompatActivity { @注入 IAppDBHelper 助手;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ((MyApplication)getApplication()).getComponent()
            .inject(this);
    // It's OK
    helper.getWritable().execSQL("XXX");

    startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
}

第二个活动:

public class SecondActivity extends AppCompatActivity {
@Inject
IAppDBHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    // nullPointer on helper
    helper.getWritable().execSQL("XXX");
}
}

injectAppComponent 在我的SecondActivity 中,nullPointer 错误修复后,但我的问题是每次我想注入IAppDbHelper 时我是否必须inject 我的AppComponent?那么@Singleton 和注入我的MainActivity 是什么意思?他们不应该为我的SecondActivity 注入IAppDbHelper 吗?

【问题讨论】:

    标签: android dependency-injection dagger-2


    【解决方案1】:

    您将需要获取您的组件并注入Android 创建的每个类。这通常意味着所有活动、片段和视图。 Dagger 无法创建这些类,因此 Dagger 知道外部创建的实例的唯一方法是将其传递给组件上的 inject 方法。

    在注入期间,将提供 MainActivity 和 SecondActivity 上的所有 @Inject 字段,并且 Dagger 创建的任何实例也将注入其依赖项,依此类推。这意味着您通常不需要直接在外部创建的类(如活动和片段)之外使用组件,或者(当然)在您创建组件实例本身的应用程序实例之外。

    @Singleton 确实意味着该实例在 MainActivity、SecondActivity 以及 Android 可能在您将应用程序后台运行时可能创建的任何未来 MainActivity 或 SecondActivity 实例之间保持不变。但是,您仍然需要在 Android 创建这些类时为这些类请求注入,以便接收您使用 @Singleton 保证的相同实例。

    【讨论】:

    • 感谢您的完整回答,那么我是否必须为需要 IAppDbHelper 再次注入的每个 logic 类传递一个 Context 参数?我的问题是在没有上下文的类中使用那些 singleton 依赖项。
    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多