作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 this library我已将其作为模块安装在本地。我可以通过我的主项目访问它,但我不能做相反的事情。例如,从这个库访问我的主项目中的一个变量......
我尝试在库的 build.gradle
中添加这一行:
implementation project(':app')
但我得到了这个奇怪的错误:
Circular dependency between the following tasks:
:placepicker:generateDebugRFile
\--- :placepicker:generateDebugRFile (*)
(*) - details omitted (listed previously)
我怎样才能解决这个问题?我的项目在 Java 中,我的库在 Kotlin 中
最佳答案
“循环依赖”只能通过删除在两侧之一上导致此问题的依赖性来修复。
如果您需要从库代码中访问一些数据,您可以在库中实现一个接口(interface),该接口(interface)将由项目中的某个类扩展。然后你就可以在你的库中使用扩展类和接口(interface)中定义的访问方法.
例子
假设您需要在库中获取对应用程序上下文的引用。您应该创建一个接口(interface):
interface ContextAccessor {
// Marking it as optional just in case
// you will not be able to get a context
// from an object that implemented ContextAccessor
fun getApplicationContext(): Application?
}
因为您在项目中添加了库作为依赖项,所以您可以访问
ContextAccessor
.用这个接口(interface)扩展一些类并实现
getApplicationContext
方法。假设您想扩展一些
Activity
.
class MyActivity: Activity, ContextAccessor {
... other code here
override fun getApplicationContext(): Application? = application
}
现在从您的
MyActivity
类,可以设置
ContextAccessor
进入你的图书馆,就像它是
dependency injection .
class MyActivity: Activity, ContextAccessor {
... other code here
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val someLibraryClassInstance = SomeLibraryClass()
someLibraryClassInstance.setContextAccessor(this)
// OR -> `someLibraryClassInstance.contextAccessor = this`
}
}
警告 :当您保存对任何 Android 组件的引用时,尤其是 Activity、Fragment、Dialog 等,请确保稍后在对象将要被销毁时删除此引用以避免内存泄漏。
class MyActivity: Activity, ContextAccessor {
... other code here
private val someLibraryClassInstance = SomeLibraryClass()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ContextAccessor reference is set to some library class
someLibraryClassInstance.setContextAccessor(this)
}
override fun onDestroy() {
super.onDestroy()
// Super important!
someLibraryClassInstance.setContextAccessor(null)
// OR create some method like `someLibraryClassInstance.removeContextAccessor(this)`
}
}
Java中的相同类
interface ContextAccessor {
// Marking it as optional just in case
// you will not be able to get a context
// from an object that implemented ContextAccessor
Application getApplicationContext();
}
public class MyActivity extends Activity implements MyActivity.ContextAccessor {
private SomeLibraryClass someLibraryClassInstance = SomeLibraryClass();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ContextAccessor reference is set to some library class
someLibraryClassInstance.setContextAccessor(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
// Super important!
someLibraryClassInstance.setContextAccessor(null);
// OR create some method like `someLibraryClassInstance.removeContextAccessor(this)`
}
@Override
public Application getApplicationContext() {
return super.getApplication();
}
}
更新(2020 年 8 月 10 日):如何使用 ContextAccessor?
ContextAccessor
在你的图书馆:
class SomeLibraryClass {
private var mContextAccessor: ContextAccessor?
fun setContextAccessor(contextAccessor: ContextAccessor?) {
mContextAccessor = contextAccessor
}
fun someOtherMethod() {
mContextAccessor?.getAppContext()?.let { nonNullContext ->
// use nonNullContext here
}
}
}
关于java - 从 Android Studio 中的模块访问主项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63204657/
我有一个看起来像这样的出租车列表: 1204725 2162 1300163 420247 我希望从上面的taxids中按顺序获得一个带有分类ID的文件: kingdom_id phylum
我有物种的分类 ID,我可以从 NCBI ( https://www.ncbi.nlm.nih.gov/Taxonomy/TaxIdentifier/tax_identifier.cgi ) 获得物种
我是一名优秀的程序员,十分优秀!