11

我在单个 android 项目中创建了两个模块。

  1. 应用程序模块(这是我的默认应用程序模块)

  2. 和另一个添加的库模块。

现在 app 模块有很多 java 类。我想访问.Java class库模块中的应用程序模块。

模块 appDatabaseHelper在包 xyz 中有一个类

现在我想DatabaseHelperLibrary模块中导入类。

DatabaseHelper不被安卓识别。

问题,

是否可以将类从应用程序模块导入另一个模块?

任何其他方式。

我的文件

构建.gradle(应用程序)

compile project(':materialList')

设置.gradle

include ':app', ':Library'
4

3 回答 3

6

是否可以将类从应用程序模块导入另一个模块?

这是不可能的,因为这将创建一个循环依赖。

但是,在这种情况下可以使用一种模式:

  • 定义数据类型:library模块中的DatabaseHelperContent
  • 在库模块中定义一个接口 DatabaseHelperI,其实现者应该提供数据。
  • 创建一个实现DatabaseHelperI接口的DatabaseHelperImpl类,提供数据(这个类在app模块中)
  • 将接口初始化为类ABC的实例,同时在Application类中引用它,从而可以将类中的数据动态传递给子模块。

使用像 Dagger 这样的依赖注入框架,这将变得更加简单,您可以在 @Module 类中指定接口的提供者,并在任何地方使用来自公共提供者的注入数据。

于 2017-11-14T22:21:32.863 回答
3

不,没有办法。重新考虑您的设计。也许DatabaseHelper进入library项目?

app在您的设计中,模块和模块之间将存在循环依赖关系library

其他模块的目的是分离完全独立的代码片段并将它们移动到外部位置。并在其他模块中使用它们。

于 2016-11-15T12:18:34.137 回答
2

这是一个相当古老的问题,我相信作者已经找到了解决方案,但我认为这个问题缺少很多人想知道的答案。

因此,实际上,正如其他答案中所建议的那样,这通常可能是由您的架构问题引起的。
但有时它可能是合理的。例如,如果您需要在库中或在许多其他情况下访问您的应用程序 ID。

因此,如果您需要从库模块中的应用程序模块访问资源,
可以借助依赖注入轻松完成。

例如,使用 Dagger 可以这样做:

1.创建一个提供共享资源的模块。我们称它为集成模块。

@Module()
class IntegrationModule {

    @Provides
    @Named("foo")
    fun provideFoo() = "Hey bro"
}

2.将其包含在您的 App 组件中

@Component(modules = [
    AndroidSupportInjectionModule::class,
    AppModule::class,
    IntegrationModule::class,
    YourLibraryModule::class
])
@Singleton
interface AppComponent : AndroidInjector<App> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun app(app: Application): Builder

        @BindsInstance
        fun context(context: Context): Builder

        fun build(): AppComponent
    }
}

3.在你的图书馆某处注入它

@Inject @Named("foo") lateinit var foo: String

而已。
为简单起见,省略了 Base Dagger 实现代码。

于 2020-11-20T14:14:43.157 回答