首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Android的库类中访问应用程序模块类?

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

Stack Overflow用户
提问于 2016-11-15 12:11:34
回答 3查看 10.1K关注 0票数 14

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

  1. app模块(默认为我的应用程序模块)
  2. 和另一个新增的库模块。

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

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

现在,我想在DatabaseHelper模块中导入类Library。

安卓系统不承认DatabaseHelper。

问题,

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

任何其他方式。

MyFiles

build.gradle(app)

代码语言:javascript
复制
compile project(':materialList')

setting.gradle

代码语言:javascript
复制
include ':app', ':Library'
EN

回答 3

Stack Overflow用户

发布于 2017-11-14 22:21:32

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

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

然而,在这个场景中可以使用模式:

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

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

票数 8
EN

Stack Overflow用户

发布于 2016-11-15 12:18:34

不,不可能。重新考虑你的设计。也许把DatabaseHelper搬到library项目中去?

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

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

票数 4
EN

Stack Overflow用户

发布于 2020-11-20 14:14:43

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

因此,实际上,正如在其他答案中所建议的那样,这通常是由您的体系结构问题引起的。

但有时这可能是合理的。例如,如果您需要访问库中的应用程序id,或者在许多其他情况下。

因此,如果您需要访问库模块中的应用程序模块中的资源,

它可以很容易地通过依赖注入.来完成。

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

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

代码语言:javascript
复制
@Module()
class IntegrationModule {

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

2.将其包含在应用程序组件中

代码语言:javascript
复制
@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.把它注射到图书馆的某个地方

代码语言:javascript
复制
@Inject @Named("foo") lateinit var foo: String

就这样。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40609547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档