下面是所有Android程序員的問題:您寧願使用測試Build.VERSION.SDK_INT或反射來測試存在嗎?
在我的應用程序中使用舊的和新的API方法時,我找到了兩種方法來處理不同的API方法。
試驗SDK_INT如
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { holder.content.setBackground(background); } else { holder.content.setBackgroundDrawable(background); }
程序使用反射來測試方法存在如
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(); }
現在 「COMPAT」 級,後者人們正在從Carlos Sessa的一本偉大的書籍「50 Android hack」中獲益。 我被教導說,使用異常處理進行流量控制是一件壞事,而不是要做。如果你可以對某些東西進行測試,不要刻意進入異常處理。 因此,方法2不會被視爲「乾淨」。
但是:在移動設備上,這是首選的方法?長遠來看,哪一個更快?
感謝您的所有意見!
就像我發現這個主題很有趣的一個附加問題,當/如果你正在檢查兼容性的方法從SDK中刪除使用情況1,該項目將不會構建它會發生什麼? – tyczj
@tyczj:幾乎不會刪除的方法。如果它們不再被支持,它們會變成空操作,或者可能被修改爲拋出某種形式的「RuntimeException」,只是爲了避免這種問題。這就是說,是的,'Build'技術假定應用程序正在使用包含有問題的方法的構建目標進行編譯。 – CommonsWare