处理弃用的方法

时间:2013-07-02 06:47:41

标签: java android deprecated

通常在使用弃用方法时,我们使用类似

的方法
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类。

2 个答案:

答案 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问题的影响,因为它永远不会在新平台上使用不推荐使用的方法加载类。