我应该如何在 Android 中使用/不使用已弃用的方法
Posted
技术标签:
【中文标题】我应该如何在 Android 中使用/不使用已弃用的方法【英文标题】:How should I be using/not using deprecated methods in Android 【发布时间】:2015-12-24 19:42:11 【问题描述】:我已经很久没有问这个问题了。我在 android 中遇到过许多已弃用的方法,但仍可在较新版本的 API 中使用。那么,只要可行,使用已弃用的方法有什么风险呢?
这是一个更具体的问题。我正在使用 TimePickers,getCurrentHour() 方法在 API 23 中已被弃用,取而代之的是getHour()。我显然不能专门使用getHour()
,因为大多数设备还没有使用API 23,但是最新版本的Android 使用getCurrentHour()
“错误”?我应该做以下哪一项?
-
继续使用
getCurrentHour()
直到几年过去 API 23 成为我的新 minSdkVersion
?
在代码中,明确检查 API 版本并根据结果调用getCurrentHour()
或getHour()
?
感谢您帮助我学习。
【问题讨论】:
In code, explicitly check the API version and call either getCurrentHour() or getHour() based on the result?
这是正确的方法
【参考方案1】:
对最新版本的 Android 使用 getCurrentHour()“错误”?
如果“错误”是指它会杀死一只小狗,不,它不会是错误的。对于 API 级别 23,它不太可能导致任何问题。
一般来说,“已弃用”的意思是“我们希望您使用其他东西”。弃用的东西会发生什么变化:
有时,已弃用的内容在多年后仍然可用。早在 2009 年,AbsoluteLayout
在 API 级别 3 中就已被弃用。今天它仍然像当时一样糟糕。
有时,已弃用的内容会减少功能。出于安全和隐私原因,ActivityManager
上的各种方法已被弃用,并返回它们过去使用的方法的子集。
因此,弃用警告是一个信号,需要注意并考虑您对这一特定功能的长期策略。
我应该做以下哪一项?
对于像此方法重命名这样微不足道的事情,您可能对您的第一个选项是安全的(坚持使用已弃用的方法,直到您的 minSdkVersion
上升到足够高)。
不过,对于任何比这更大的事情,我会选择你的第二个选项。有时,您会明确地进行版本检查。有时,您可以使用会为您隐藏版本检查的库。例如,在support-v4
库中几乎任何你看到...Compat
类的地方(例如,NotificationCompat
、ContextCompat
、ActivityCompat
),该类的作用是提供与最新版本等效的 API - ***别的 API 级别,但可以在各种设备上使用,因为它通过为您执行这些版本检查而在旧设备上优雅地降级。
注意:在创建此答案时没有真正的小狗受到伤害
【讨论】:
如何确定是否可以使用可以为您完成这项工作的库?我发现自己面临与使用 TimePicker 的 OP 相同的问题,并且只是“正确地做”,即在决定使用哪种方法之前检查android.os.Build.VERSION.SDK_INT>=23
是否。 Studio 仍然通过已弃用的功能划线并给我一个警告 :-( 我错过了一个或多个技巧吗?
@Yannick:“如何确定是否可以使用可以为您完成这项工作的库?” -- 查找库并阅读它们的文档。 “Studio 仍然通过已弃用的功能划线并给我一个警告”——那是因为它们已被弃用。如果你愿意,你可以添加一个@SuppressWarnings("deprecation")
注释(如果我正确地记住了确切的注释值......)。
但是,web api 调用被贬低会发生什么?如果他们决定删除它,应用程序会在某个时候停止工作吗?例如,通过某些已弃用 v1 方法的 3rd 方库将内容上传到 Internet,现在强制使用 v2 调用(但由于某些旧原因,您仍然必须使用 v1)。
@Beemo:我不明白你在问什么。我建议你问一个新的 Stack Overflow 问题,在那里你详细解释你的担忧是什么。请务必准确解释“web api 调用被贬低”的含义,以及“如果他们决定删除它”中的“他们”是谁。
我这么说是因为我不想深入了解我的问题。最好能在堆栈上看到我的问题 -> ***.com/questions/34913135/… 通过 Web API,我的意思是使用那些旧 v1 调用的 Amazon API。以上是关于我应该如何在 Android 中使用/不使用已弃用的方法的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS7 中,我应该使用啥来代替已弃用的 GKLeaderboardViewController?