我在单个android项目中创建了两个模块。
app模块(默认为我的应用模块)
和另一个添加的库模块。
现在app模块有很多java类。我想访问库模块中的.Java class
app模块。
模块应用在xyz包中有一个类DatabaseHelper
现在我要在DatabaseHelper
模块中导入类Library
。
DatabaseHelper
。
问题,
是否可以将类从应用模块导入另一个模块?
任何其他方式。
MYFILES
的build.gradle(APP)
compile project(':materialList')
setting.gradle
include ':app', ':Library'
答案 0 :(得分:3)
是否可以将App从app模块导入另一个模块?
这不可能,因为这会产生循环依赖。
但是,在这种情况下可以使用一种模式:
library
模块app
模块中)使用一些依赖注入框架,这将变得更加简单 像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实现代码。