当我在使用java之前在Android中使用处理程序时,我会得到一个Android Studio lint消息,说我应该使用静态处理程序,否则会发生内存泄漏。 由于Kotlin没有静态关键字,我应该如何处理? 这是我的class级: class TaskDetailActivity : AppCompatActivity() { private val handlerComment = MyOptionMenuBarHandler(this) private fun setUpToolBar() { handlerComment.sendEmptyMessage(0) } private class MyOptionMenuBarHandler(activity: TaskDetailActivity) : Handler() { private val activity: WeakReference = WeakReference(activity) override fun handleMessage(msg: Message) { //do the work ….. } } } 有什么特别的我需要做,以避免使用Kotlin的内存泄漏?
我遇到以下错误,当我尝试构建我的应用程序。 它已经建立与kotlin扩展,但突然它给了我这个错误。 Gradle同步失败:对于输入字符串:“”,它指向build.gradle应用插件:“kotlin-android”行。
我有以下代码: 在@ConfigurationProperties类需要遵循具有可变属性的JavaBeans约定的Spring中有一个限制。 而不是注入可变的TokenConfigurationConfig我们注入接口。 public interface TokenAuthenticationConfig { public fun apiKey() : String } @Component @ConfigurationProperties(prefix = “service.api”) public open class TokenAuthenticationConfigImpl : TokenAuthenticationConfig { public var apiKey : String constructor() { this.apiKey = “” } override fun apiKey(): String { return this.apiKey } } 它工作正常,但只是想知道: 在Kotlin中可以用一个不可变属性来定义一个接口吗? 接口的使用将会看到该属性是不可变的,而类的用户会认为它是可变的。
我在Kotlin中有一个方法,如下所示: fun addEventListener(eventClass: Class, eventHandler: EventHandler) { eventListeners.put(eventClass, eventHandler) } 另外我有一个属性eventListeners但我不知道如何定义它,所以它会有相同的genericstypes,有点像这样 private val eventListeners = HashMap<Class, EventHandler>() 很明显, T不会为属性eventListeners而eventListeners ,那就是我正在努力的。 大家都知道,我知道T可以被定义为整个类(例如, class MyClass {…} ),这样就简单了,但在这种情况下,我不能做到这一点。
我刚开始学习kotlin,并正在阅读Android Studio生成的代码。 我注意到我可以做类似的事情 view.setOnClickListener { callAnotherMethod() } 所以我创建了一个测试界面 interface TestListener { fun onTest() } 并设置监听器的fun private fun setTest(listener: TestListener) { } 但在这个时候调用setTest{ callAnotherMethod() }不会工作。 我不明白为什么。 setOnClickedListener()是要求一个接口, setTest 。 同时, OnClickListener是一个接口, TestListener 。 为什么我不能用TestListener做同样的事情?
我需要( @Named )注入dagger2到一个kotlin委托的属性。 //works great! @set:Inject var cat: Cat by Ref(ref) //fails @set:[Inject Named(“dog”)] var dog : Animal by Ref(ref) 所以我试了 //fails, can’t use `@field` with a delegated property @field:[Inject Named(“dog”)] var dog : Animal by Ref(ref) //fails, can’t use `lateinit` with a delegated property @field:[Inject Named(“dog”)] lateinit var dog : Animal by Ref(ref)
在匕首2.11之后,我们可以使用一个@Binds注解,并且在这种情况下将我们的模块标记为抽象,这比混凝土更有效率。 如果我的模块同时拥有@Provides和@Binds方法,我有两个选择: 最简单的方法是将你的@Provides实例方法标记为静态。 如果需要将它们保存为实例方法,那么可以将模块拆分为两个,并将所有的@Binds方法抽取到一个抽象模块中。 第二个选项在Java和Kotlin中工作正常,但第一个选项在Java中工作正常,但我不知道如何在Kotlin中实现相同。 如果将@Provides方法移动到Companion对象,则会抛出Error:(30, 1) error: @Provides methods can only be present within a @Module or @ProducerModule 。 Kotlin如何做到这一点。 第二选项:(工作) ApplicationModule.kt @Module(includes = [ApplicationModule.Declarations::class]) abstract class ApplicationModule { @Module internal interface Declarations { @Binds fun bindContext(application: Application): Context } @Provides @Singleton fun provideMvpStarterService(): MvpStarterService { return MvpStarterServiceFactory.makeStarterService() } } 第一个选项:(不工作) ApplicationModule.kt @Module abstract […]
Kotlin提供了“分号推理”:语法上,子句(例如,语句,声明等)由伪标记SEMI分隔,后者代表“分号或换行符”。 在大多数情况下,Kotlin代码中不需要分号。 这是语法页面所说的。 这似乎意味着在某些情况下需要指定分号,但是它没有指定它们,而下面的语法树并没有明确地表示这一点。 此外,我怀疑有些情况下,此function可能无法正常工作,并导致问题。 所以问题是应该在什么时候插入一个分号,以及为了避免编写错误的代码,需要注意哪些角落情况?
有一个社区的问题。 我现在学习Kotlin,刚刚遇到了一个叫做解构声明的概念 – 当你可以一次返回一个函数的多个值。 这似乎很方便,但同时它看起来像一个棘手的解决方法。 每当我想到Java中的这个特性时,我都明白这是我的架构中的一个漏洞 – 那么应该有一个类,而不仅仅是一些variables! 你们有什么感想?
要从Facebook Hacker Cup 2016 Boomerang Constelations问题的文件中读取星星,可以定义以下扩展函数: fun BufferedReader.readStars(n: Int): Set { return Array(n) { val (l1, l2) = readLine().split(” “).map { it.toInt() } Star(l1, l2) }.toHashSet() } 代码是紧凑的,但值首先读入一个数组,然后转换为HashSet 。 有没有一种方法可以直接初始化Kotlin中的大小为n和初始化函数的HashSet ? 更新:标准Kotlin库中是否存在一种方法?