我已经阅读了关于回收TypedArray
的几十个问题
,但我想它们有点太旧了,并且是在我们广泛使用
try-with-resource
语句之前编写的,所以他们都没有谈论使用
AutoCloseable
的
TypedArray
实现,自API 级别 31 以来一直存在 所以问题依然存在:如果有的话,该警告应该是 minSDK 警告(如果适用),对吧? 由于完全支持尝试,我们可以简单地编写以下内容(如果我们在 SDK 级别 >= 31 检查之后执行此操作)吗?
try (TypedArray array = getContext().obtainStyledAttributes(attrs) {
// Do someting
}
// End of method
我的猜测是肯定的,因为这是 AutoCloseable
的
TypedArray
实现
我刚刚更改了 Lint 告诉我使用 try-with-resource 语句的旧代码。我必须删除之前回收数组的finally块。
try (TypedArray arr = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyClass, 0, 0)){
// do something useful with arr
}
不再有警告。代码按预期工作。
所以问题依然存在:这在 Lint 中是误报吗?不,不是。因为使用 try/catch 时,并不会神奇地调用
close
接口中的
AutoCloseable
方法。相反,你必须使用
use
方法,然后只有这样你才能摆脱 try/catch,如下所示:
getContext().obtainStyledAttributes(attrs).use({
// Do something
});
但是,请注意,use
类中的
TypedArray
方法仅在自Android 31起可用 如果您更喜欢向后兼容的解决方案,可以使用
use
库中的
androidx.core:core-ktx
方法。由于
TypedArray
还提供了
use
方法,因此您必须注意添加以下导入:
import androidx.core.content.res.use