1. 程式人生 > >Android從配置檔案談後期開發可拓展性

Android從配置檔案談後期開發可拓展性

1.為什麼使用配置檔案

專案中經常用到配置檔案,android中也包含很多配置檔案,比如local.properties、gradle.properties等專案自帶的配置檔案,也有開發自己維護的配置檔案,比如properties.properties.

配置檔案的格式一般是這樣的:(還有以json、xml、ini格式的配置檔案,不在本文討論範圍)

baseurl=www.baidu.com
host=127.0.0.1
port=8080

通常以鍵值對的方式存在,就像ios中的NSDictionary一樣,以key-value形式存在的儲存方式,通常通過key獲取value進行資料讀取。

在軟體系統配置檔案更是隨處可見,使用配置檔案到底有什麼好處呢

2.配置檔案的好處

專案開發中,不管是需求也好,架構也罷,變是肯定的,沒有哪一個專案從頭做到尾,一點不變。

比如說:

  • 更換伺服器,地址變了,埠變了
  • 資料庫賬號密碼變了
  • 地圖引擎開始用arcgis,後來用osmdroid了(配置檔案只是其中的一小步)
  • …………

變數太多,我們能做的就是將後期工作量降到最低,而且專案後期的可拓展性、可移植性更高,當然前期開發工作量會增加。用一句話概括,以不變應萬變。

舉個簡單的例子:

web專案上線後,伺服器地址變了,對應方式:

①地址寫在配置檔案中:去專案配置檔案修改伺服器地址,類似於上面例子的檔案。清晰,一目瞭然


②地址寫在類裡:先去程式碼裡找到寫伺服器的地方,然後修改程式碼,在然後重新編譯釋出

兩種方式的效率和工作量很明顯,配置檔案的確讓維護更加方便。當然這種情況在android中並不現實,對於也只是對應介面的改變。但在實際開發中,配置檔案的使用也很大。

通過簡單的例子我們可以總結,使用配置檔案的特點及好處:

  • 提高可維護性
  • 減少維護工作量
  • 提高效率
  • 可拓展性(下面會講)
  • 儲存設定(比如window的.ini檔案)
  • 修改後重啟即可
  • ……

3.配置檔案在android的使用

個人總結有兩種方式:

3.1 使用android資原始檔

android提高的strings.xml來統一管理andoird中出現的字串,我們可以借用一下。類似於下面

<!-- 地圖引擎全類名 -->
<string name="map_engine">kmap.KMapWrapper</string>

獲取當然也很簡單

String clazz=context.getResources().getString(R.string.map_engine);
//後續...

當我們需要修改的時候可以直接在strings.xml中修改,當然也可以新建一個.xml資原始檔,當成你的配置檔案,獲取方式相同。

3.2 新建檔案的方式

我們自己的資原始檔一般都放在assets資料夾中(聲音視訊一半放在raw),目錄下但在android studio中assets資料夾預設是不自動生成的,而標準的android目錄結構一般為:

-src/
  -androidTest/
  -main/
    -AndroidManifest.xml
    -res/
    -assets/
    -aidl/
    -rs/
    -jni/
    ... 

在main下直接新建assets資料夾,新建檔案properties.properties,輸入如下內容:

url=www.baidu.com

注:key——value都是字元形式,以=隔開

讀取配置檔案的工具類

public class ReadPropertyUtil {

public static String getProperty(Context ctx, String keyName) throws IOException {
    Properties pro = new Properties();

    InputStream in = ctx.getResources().getAssets().open("property.property");
    pro.load(in);
    return pro.getProperty(keyName, "沒有獲取到資原始檔的內容");

}

}

實際呼叫

String url = null;
try {
    url = ReadPropertyUtil.getProperty(this, "url");
} catch (IOException e) {
    e.printStackTrace();
}

Toast.makeText(this, url, Toast.LENGTH_SHORT).show();

到此,配置檔案的基本使用已經介紹的差不多了

4.配置檔案+反射談可拓展性

(會有單獨的一篇文章介紹地圖引擎拓展,所以下面只是簡單介紹)

實際專案中的例子,公司專案本來用的google的地圖,但是因為收費,自定義等方面的問題要更換稱自由度更高的Osmdriod地圖,因為本來專案未做抽取,所以改起來超級麻煩,幾乎用到地圖的每一個地方都需要重新修改,工作量不是一般的巨大。

總有解決的辦法,一次受累,終生舒坦,開始了抽取之路。

定義自己的地圖介面IMap,介面中的方法根據實際專案而定,比如畫點線面等一些基礎的操作,還有一些特殊定製的地圖操作。

然後在實際呼叫中不能出現第三方的api,只能呼叫自己寫的IMap中的方法,意思就是呼叫依賴介面。所以整體流程不會出現任何有關第三方api的東西。

然後開始寫實現,比如說剛開始用的google地圖引擎,我們定義一個GoogleWrapper實現IMap介面,實現對應方法,在構造方法中持有一個google的Mapview物件,類似於代理模式的方式,實現介面中方法。

實現類寫好了,如何例項化呢,通過反射(為什麼通過反射,直接new不行嗎?)

//clazz為配置檔案中獲取的地圖引擎的全類名
Class cls = Class.forName(clazz);
Class[] paramTypes = { Context.class };// 引數
Object[] params = { ctx }; // 方法傳入的引數
Constructor con = cls.getConstructor(paramTypes); // 根據引數呼叫構造器
IMap map = (IMap) con.newInstance(params); // 例項化物件

通過上面的方式進行例項化獲得一個IMap物件,其實就是配置檔案中的地圖引擎的全類名。至此,基本上結束了,可能你還看不出這樣到底有什麼好處?那麼問題來了,現在google地圖國內被牆了,突然不能用了,你不能告訴使用者說你開個代理,一個月才十幾塊錢吧,只能換地圖引擎,那麼接下來換地圖引擎的步驟是什麼?

1. 第一步:定義OsmWrapper繼承IMap並實現相應的方法,用Osmdroid的Api
2. 第二部,修改配置檔案中的全類名
3. 看電影
4. 聽音樂
5. 唱歌
6. 下班

現在好處可以一目瞭然了吧,可以讓你拿出更多的時間來泡妞,打遊戲,睡覺……當然如果你想提升一下自己的能力,那就用省下來的時間學習吧。

生命不止,學習不停!