如何从Android中的库类访问应用程序模块类?

时间:2016-11-15 12:11:35

标签: android android-gradle build.gradle android-build android-gradle-2.2

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

  1. app模块(默认为我的应用模块)

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

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

    模块应用在xyz包中有一个类DatabaseHelper

    现在我要在DatabaseHelper模块中导入类Library

    android无法识别

    DatabaseHelper

    问题,

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

    任何其他方式。

    MYFILES

    的build.gradle(APP)

    compile project(':materialList')
    

    setting.gradle

    include ':app', ':Library'
    

3 个答案:

答案 0 :(得分:3)

  

是否可以将App从app模块导入另一个模块?

这不可能,因为这会产生循环依赖。

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

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

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

答案 1 :(得分:2)

不,没有办法。重新思考你的设计。也许将DatabaseHelper移到library项目中?

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

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

答案 2 :(得分:0)

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

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

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

例如,使用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

就是这样。
为了简单起见,省略了基本Dagger实现代码。