2013-07-03 33 views
1

下面是所有Android程序員的問題:您寧願使用測試Build.VERSION.SDK_INT或反射來測試存在嗎?

在我的應用程序中使用舊的和新的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. 程序使用反射來測試方法存在如

    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不會被視爲「乾淨」。

但是:在移動設備上,這是首選的方法?長遠來看,哪一個更快?

感謝您的所有意見!

回答

1

這是首選方法?

恕我直言,請使用Build

從長遠來看哪一個更快?

Build

更重要的是,Build告訴你什麼是支持,因爲您正在閱讀JavaDocs並根據該文檔確定是否執行某些操作。

公共Java類有很多公共方法,其中類在Android SDK中,但方法不是。那些在AOSP源代碼中被標記爲@hide,並且在創建我們鏈接到的android.jar時被剝離,創建JavaDoc時等。這些表示在Android團隊眼中「未準備好黃金時間」的方法,但需要在框架內公開內部使用。反射技術將高興地報告說,這種隱藏方法可供使用,即使:

  • 他們的方法簽名,可能與最終是在SDK發佈的不同(參數,返回類型,異常),或者是由於Android團隊變更或製造商改變

  • 的那些隱藏方法的行爲是未記錄,因此可能不匹配記錄的功能時,這些方法被釋放

我是一個大@Macarse粉絲,但這是我們必須同意不同意的一種情況。

+0

就像我發現這個主題很有趣的一個附加問題,當/如果你正在檢查兼容性的方法從SDK中刪除使用情況1,該項目將不會構建它會發生什麼? – tyczj

+0

@tyczj:幾乎不會刪除的方法。如果它們不再被支持,它們會變成空操作,或者可能被修改爲拋出某種形式的「RuntimeException」,只是爲了避免這種問題。這就是說,是的,'Build'技術假定應用程序正在使用包含有問題的方法的構建目標進行編譯。 – CommonsWare

相關問題