【问题标题】:Would you rather use testing Build.VERSION.SDK_INT or reflection to test for existence?您更愿意使用测试 Build.VERSION.SDK_INT 还是反射来测试是否存在?
【发布时间】:2013-07-03 13:50:43
【问题描述】:

这是一个针对所有 Android 程序员的问题:

在我的应用中使用新旧 API 方法时,我发现了两种方法来处理不同的 API 方法。

  1. 中测试 SDK_INT
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        holder.content.setBackground(background);
    } else {
        holder.content.setBackgroundDrawable(background);
    }
    
  2. 编写一个“Compat”类,它使用反射来测试方法是否存在,如

    private static final Method sApplyMethod = findApplyMethod();
    
    private static Method findApplyMethod() {
        try {
            Class<?> cls = SharedPreferences.Editor.class;
            return cls.getMethod("apply");
        } catch (NoSuchMethodException unused) {
            // fall through
        }
        return null;
    }
    
    public static void apply(final SharedPreferences.Editor editor) {
        if (sApplyMethod != null) {
            try {
                sApplyMethod.invoke(editor);
                return;
            } catch (InvocationTargetException unused) {
                // fall through
            } catch (IllegalAccessException unused) {
                // fall through
            }
        }
        editor.commit();
    }
    

现在,后者取自 Carlos Sessa 的一本好书“50 Android hacks”。 我被教导使用异常处理来进行流控制是一件坏事,而且不应该这样做。如果您可以针对某些东西进行测试,请不要故意遇到异常处理。 因此,方法 2 不会被认为是“干净的”。

但是:在移动设备上,哪个是首选方法?从长远来看,哪个更快?

感谢您的所有意见!

【问题讨论】:

    标签: android compatibility android-version


    【解决方案1】:

    哪个是首选方法?

    恕我直言,请使用Build

    从长远来看,哪个更快?

    Build.

    更重要的是,Build 告诉您什么是支持,因为您正在阅读 JavaDocs 并根据该文档确定是否要执行某项操作。

    公共 Java 类上有很多公共方法,其中类在 Android SDK 中,但方法不在。那些在 AOSP 源代码中被标记为@hide 并在创建我们链接到的android.jar 时被剥离,在创建 JavaDocs 时等等。这些代表在他们眼中“还没有准备好迎接黄金时间”的方法Android 团队,但需要在框架内公开以供内部使用。反射技术会很高兴地报告这些隐藏的方法可供使用,即使:

    • 由于 Android 团队变更或制造商变更,它们的方法签名(参数、返回类型、异常)可能与 SDK 中最终发布的不同

    • 这些隐藏方法的行为未记录在案,因此可能与发布这些方法时记录的功能不匹配

    我是@Macarse 的忠实粉丝,但这是我们必须同意不同意的情况。

    【讨论】:

    • 作为对 OP 问题的补充,我觉得这个主题很有趣,当/如果您检查兼容性的方法从使用案例 1 的 SDK 中删除时会发生什么,该项目甚至不会构建是吗?
    • @tyczj:方法几乎永远不会被删除。如果不再支持它们,它们将变成无操作,或者可能被更改为抛出某种形式的RuntimeException,只是为了避免此类问题。话虽如此,是的,Build 技术假设应用程序正在使用包含相关方法的构建目标进行编译。
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多