在线等,挺急的


#1

定义一个方法,方法里传入参数,为什么会在下面提示value captured in a closure(闭包中捕获得值),有什么解决办法没


#2

这应该只是 “建议性的” 提示 sql 作为局部变量 , 被传到了闭包方法(ThreadUtil.runOnBackThread) 调用了

不修改应该问题不大

如果 sql 是 类里面的成员变量 就不会提示这个了


#3

提示这句话, 应该还有一层意思

外层作用域 的 Value 被 lambda 闭包捕获后, 在闭包里被使用时有可能外层作用域已经不存在

言外之意 如果Value 比较占用资源, 可能会有内存泄漏, 可以用 弱引用包装一下

e.g.

   class ThreadUtils {
        companion object {

            fun runOnBackThread(task: () -> Unit) {
                // do something
            }
        }
    }

    fun shareQuery(sql: String) {

        ThreadUtils.runOnBackThread {
            sql.length//TODO 这里会提示  'value captured in a closure'
        }
    }

    fun shareQueryWrap(sql: String) = wrapWeak(sql) {
        ThreadUtils.runOnBackThread {
            val s = it.get()
            s?.length //TODO 这里仍然会提示  'value captured in a closure', 
     // 但是不会造成内存泄漏, 
     // 当然这里的String  是没必要用弱引用包裹的, 只是举个例子
        }
    }

    fun <T> wrapWeak(target: T, block: (WeakReference<T>) -> Unit) {
        val ref = WeakReference(target)  // TODO 用弱引用包装, 防止某些对象内存泄漏
        block(ref)
    }

#4

感谢,这么做也是优化之一


京ICP备16022265号-2 Kotlin China 2017 - 2018
本站由腾讯云提供计算服务