聊聊Apt/Annotation Processor
背景
開發過程中,經常會遇到要編寫好多重複性代碼,這個時候就要使出control-c,control-v大法,但是萬一粘貼錯了怎麼辦。有沒有靠譜一點的解決方案。
先來看一個小例子,讀取Settings的相關配置。
以下代碼為精簡過的偽代碼。
public interface IGlobalSettingObserver {
void onSaveData(SharedPreferences.Editor editor);
void onLoadData(SharedPreferences sp);
}
簡單解釋下上面的介面,每個功能模塊自定義自己的SettingObserver,實現onSaveData, onLoadData方法
public class GarageGlobalSetting implements IGlobalSettingObserver {
private String sp_key_ad_banner_enable = "sp_key_gs_garage_ad_banner_enable";
private String sp_key_ad_banner_info = "sp_key_gs_garage_ad_banner_info";
private String sp_key_operation_entrance_count = "sp_key_gs_garage_operation_entrance_count";
private String sp_key_operation_entrance_info = "sp_key_gs_garage_operation_entrance_info";
private String sp_key_garage_tab_title = "sp_key_garage_tab_title";
private String sp_key_second_hand_car_url = "sp_key_second_hand_car_url";
private String sp_key_cars_classify = "sp_key_cars_classify";
public boolean ad_banner_enable;
public String ad_banner_info;
public int operation_entrance_count = 0;
public String operation_entrance_info;
public String garage_tab_title_jsonarray;
public String second_hand_car_url;
public String cars_classify;
@Override
public void onSaveData(SharedPreferences.Editor editor) {
editor.putBoolean(sp_key_ad_banner_enable, ad_banner_enable);
editor.putString(sp_key_ad_banner_info, ad_banner_info);
editor.putInt(sp_key_operation_entrance_count, operation_entrance_count);
editor.putString(sp_key_operation_entrance_info, operation_entrance_info);
editor.putString(sp_key_garage_tab_title, garage_tab_title_jsonarray);
editor.putString(sp_key_second_hand_car_url, second_hand_car_url);
editor.putString(sp_key_cars_classify, cars_classify);
}
@Override
public void onLoadData(SharedPreferences sp) {
ad_banner_enable = sp.getBoolean(sp_key_ad_banner_enable, false);
ad_banner_info = sp.getString(sp_key_ad_banner_info, "");
operation_entrance_count = sp.getInt(sp_key_operation_entrance_count, 0);
operation_entrance_info = sp.getString(sp_key_operation_entrance_info, "");
garage_tab_title_jsonarray = sp.getString(sp_key_garage_tab_title, "");
second_hand_car_url = sp.getString(sp_key_second_hand_car_url, "");
cars_classify = sp.getString(sp_key_cars_classify, "");
}
}
隨著業務的迭代,每次新增一個欄位,我們要做下面的幾件事情,1.先定義一個SP存儲的key。 2.定義一個變數存值。3.在onSaveData()方法,調用editor.put。 4.在onLoadData方法中get值。
重複代碼寫多了,一個是容易出錯,一個是容易厭煩,上面的代碼能不能自動生成?經過一系列操作後,代碼變成了這樣。
public class GarageGlobalSetting implements IGlobalSettingObserver {
@SettingKey("ad_banner_enable")
public boolean ad_banner_enable;
@SettingKey("ad_banner_info")
public String ad_banner_info;
@SettingKey("operation_entrance_count")
public int operation_entrance_count;
@SettingKey("operation_entrance_info")
public String operation_entrance_info;
@SettingKey("garage_tab_title_jsonarray")
public String garage_tab_title_jsonarray;
@SettingKey("second_hand_car_url")
public String second_hand_car_url;
@SettingKey("cars_classify")
public String cars_classify;
@Override
public void onSaveData(SharedPreferences.Editor editor) {
}
@Override
public void onLoadData(SharedPreferences sp) {
}
}
那麼進入今天的主題Annotation Processor。
Annotation Processor與APT的區別
APT(Annotation Processing Tool)是一種處理注釋的工具,它對源代碼文件進行檢測找出其中的Annotation,使用Annotation進行額外的處理。高版本的gradle已經不支持APT了。如果要使用,要把相關的代碼刪除,官方默認支持AnnotationProcessor。
//根目錄build.gradle
classpath com.neenbedankt.gradle.plugins:android-apt:1.8
//app目錄build.gradle
apply plugin: android-apt
工作原理圖
TAG:Android開發 |