Java中的"get(String!): Any?"已被弃用,是否有替代方法?

7

我有一行代码如下:

val smsRetrieverStatus = extrasObj?.get(SmsRetriever.EXTRA_STATUS) as Status

但是现在它已经被标记为过时的,如下所示:

enter image description here

有没有其他替代方法可以避免获取过时警告?

2个回答

8
如果你阅读这里的方法文档,它说:

此方法已在API级别33中被弃用。使用类型安全的特定API,具体取决于要检索的项的类型,例如getString(java.lang.String)

所以,他们告诉你停止使用通用的get()方法,而是使用特定于类型的方法--getString()getInt()getLong()等。 更新:如果您有自定义类或数据类型,则需要实现自己的逻辑来序列化该类(可能使用类似Gson的工具)。一旦将其序列化为String,则可以使用getString()

2
抱歉回复晚了。很遗憾,这对我不起作用,因为它们没有getStatus。但我可以看到这个答案对其他人有用。所以还是谢谢 :) - Amy
1
对我来说也是一样,我们使用Bundle来传输自定义对象,因此没有可用的方法适合。get(String key, Class<T> clazz) 方法不是公共的。:-/ - JerabekJakub
@Amy 但是它确实有这样的方法。它有getParcelable <T>getSerializable <T> - 而且你的对象必须是其中之一,才能首先放置在Bundle中。 - Agent_L
1
@Agent_L 很有趣,我在一个月后回到 Android 部分构建时会再试一次 :) 谢谢! - Amy
这些建议的API需要Android 33! - Dr Deo
当然会--旧版本已于API 33被弃用。 - user496854

1
你可以尝试另一种方法。
val status = extrasObj?.getParcelable(SmsRetriever.EXTRA_STATUS, Status::class.java)

请注意,这种方法不稳定,有时会抛出NPE。因此,最好捕获和处理NPE异常。


什么异常? - Marcin Orlowski
1
@MarcinOrlowski 由于在 android.os.Parcel 内部调用了方法 java.lang.Class.isInterface(),导致出现了空指针异常。 - zhezha
谢谢。有关于这个的工单吗? - Marcin Orlowski
1
@MarcinOrlowski 看起来有人已经报告了类似的问题 https://issuetracker.google.com/issues/240585930 - zhezha

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