使用 try-with-resources 时,“TypedArray 应该被回收”在 Lint 中是误报吗?

问题描述 投票:0回答:2

我已经阅读了关于回收TypedArray几十个问题

,但我想它们有点太旧了,并且是在我们广泛使用
try-with-resource
语句之前编写的,所以他们都没有谈论使用
AutoCloseable
TypedArray
 实现,自 
API 级别 31 以来一直存在

所以问题依然存在:

这是 Lint 中的误报吗? screenshot of Lint warning

如果有的话,该警告应该是 minSDK 警告(如果适用),对吧? 由于完全支持尝试,我们可以简单地编写以下内容(如果我们在 SDK 级别 >= 31 检查之后执行此操作)吗?

try (TypedArray array = getContext().obtainStyledAttributes(attrs) { // Do someting } // End of method
我的猜测是肯定的,因为这是 

AutoCloseable

TypedArray
 实现
screenshot of docs

android try-with-resources autocloseable
2个回答
0
投票
如果您使用 TypedArray 的 AutoClosable 功能,然后尝试回收它,您的应用程序将崩溃:“致命异常:main ...错误膨胀类...”

我刚刚更改了 Lint 告诉我使用 try-with-resource 语句的旧代码。我必须删除之前回收数组的finally块。

try (TypedArray arr = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyClass, 0, 0)){ // do something useful with arr }
不再有警告。代码按预期工作。


-1
投票
所以问题依然存在:这在 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
    
© www.soinside.com 2019 - 2024. All rights reserved.