在使用 try-with-resources 时,Lint 是否将“TypedArray 应该被回收”报告为误报?

3
我已阅读了SO上关于回收TypedArray的几十个 问题,但它们似乎有点过时,并且是在我们可以广泛使用try-with-resource语句之前编写的,因此它们中没有一个谈论使用TypedArrayAutoCloseable实现,该实现自API Level 31以来就存在。
因此问题仍然存在:这是Lint中的误报吗?Lint警告截图 如果适用,那么该警告应该是minSDK警告,对吧? 如果我们在SDK Level >= 31检查后这样做,我们可以简单地编写以下内容:
try (TypedArray array = getContext().obtainStyledAttributes(attrs) {
  // Do someting
}
// End of method

我的猜测是肯定的,因为这是TypedArrayAutoCloseable实现。 文档截图
1个回答

0
所以问题仍然存在:这是Lint中的误报吗?
不,不是。因为在使用try/catch时,AutoCloseable接口中的close方法并不会自动调用。
相反,您必须使用use方法,只有这样才能像以下示例一样摆脱try/catch:
getContext().obtainStyledAttributes(attrs).use({
  // Do something
});

但是,请注意,TypedArray 类的 use 方法仅在 Android 31 及以上版本中可用。

如果您想要一个向后兼容的解决方案,可以使用 androidx.core:core-ktx 库中的 use 方法。

由于 TypedArray 也提供了一个 use 方法,因此您需要注意添加以下导入:

import androidx.core.content.res.use

1
抱歉,我在文档中(您提供的或其他任何文档)找不到“use”方法,也无法编译您的代码示例或在源代码中找到“use”。请再次确认您的答案,并确保我们讨论的是同一件事,即不是“recycle”? - avalancha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接