通常在使用弃用方法时,我们使用类似
的方法public static void SetBackground(View view, Drawable icon) {
if (Build.VERSION.SDK_INT >= 16)
Helper.SetBackground(view, icon);
else view.setBackgroundDrawable(icon);
}
public class Helper {
public static void SetBackground(View view, Drawable icon) {
view.setBackground(icon);
}
}
现在,它只是一个例子。我的问题是,如果在将来的API中删除了已弃用的方法,那么应用程序将最终显示VerifyError,因为它无法找到它,就像这里View.setBackgroundDrawable
一样。也许我们需要使用Helper2类。
答案 0 :(得分:0)
一种方式就像你提到API级别一样。但更好的是使用反射并查看android版本是否支持该方法或优雅地失败/使用更新的方法
public static Method getResources;
static {
try {
Class<?> class[] = new Class[1];
class[0] = String.class;
getResources= Context.class.getMethod("getResources", class);
} catch (NoSuchMethodException e) {
Log.e(TAG, "getResources is deprecated");
}
}
将上述内容放在扩展应用程序类的类中,然后以这种方式调用
MyClass extends Application { ...}
if(MyClass.getResources!= null){
//Do stuff
} else {
//Fail or do other stuff
}
答案 1 :(得分:0)
这是处理这类事情的一个稍微丑陋的技巧:
创建两个实现接口的类:
public interface DrawableUtil {
void setBackground(View v, Drawable d);
}
public class PreJellyBeanDrawableUtil {
void setBackground(View v, Drawable d) {
v.setBackgroundDrawable(d);
}
}
public class JellyBeanDrawableUtil {
void setBackground(View v, Drawable d) {
v.setBackground(d);
}
}
现在你可以使用通常的习惯用法来构建适当的实现:
DrawableUtil util;
if (Build.VERSION.SDK_INT >= 16)
util = new JellyBeanDrawableUtil();
else
util = new PreJellyBeanDrawableUtil();
util.setBackground(view, icon);
这不会受到VerifyError问题的影响,因为它永远不会在新平台上使用不推荐使用的方法加载类。