【问题标题】:Android class with context in object field in Kotlin在 Kotlin 的对象字段中具有上下文的 Android 类
【发布时间】:2017-10-23 09:45:44
【问题描述】:

是否可以在 Kotlin 的对象类中拥有一个包含上下文的属性?在 Android 中,将上下文相关的对象放在静态字段中是一种不好的做法。 Android Studio 甚至会突出显示它并给出警告,这与没有警告的 Kotlin 不同。 示例对象:

object Example {
    lateinit var context: Context

    fun doStuff(){
        //..work with context
    }
}

【问题讨论】:

  • 在 java 中这是一个不好的做法 不......它与 Android 相关而不是 java......这意味着它在 Kotlin 中也很糟糕......跨度>
  • 还有不同的上下文......应用程序,活动,服务......存储应用程序的上下文“不那么糟糕”(你可以做得更好,但应该没有上下文泄漏)比存储活动或服务上下文
  • 是的,我的错。将其更改为 Android。

标签: java android memory-leaks kotlin


【解决方案1】:

由于objects 是单例,它们有一个静态实例。所以如果你给他们一个context 属性,你仍然以静态方式存储Context

这与将Context 放在Java 中的静态字段中的结果完全相同。


如果您编写 Kotlin 为 Java 中的 object 生成的等效代码,它实际上会导致正确的 lint 错误:

public class Example {

    // Do not place Android context classes in static fields; this is a memory leak 
    // (and also breaks Instant Run)
    public static Context context;

    // Do not place Android context classes in static fields (static reference to 
    // Example which has field context pointing to Context); this is a memory leak 
    // (and also breaks Instant Run)
    public static Example INSTANCE;

    private Example() { INSTANCE = this; }

    static { new Example(); }

}

【讨论】:

  • 但是为什么没有警告呢?
  • 因为 google 忘记了,或者用 Kotlin 的“对象”很难找到这种情况......请随时填写错误报告
  • 确实,他们可能还没有为 Kotlin objects 添加这个 lint 检查。
【解决方案2】:

您没有收到任何警告的原因是因为 android studio 没有成熟的 lint 检查规则 用于将 Kotlin 用于 android。一旦toolkit team 更新他们的lint check rules for kotlin with android,警告将再次出现。

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    相关资源
    最近更新 更多