通用核心代碼庫-code: 適合入門不久的同學學習借鑒編程思想,也可以直接拿來使用。
自我介紹
我是android開發(fā)阿桂,接下來我會分享從業(yè)幾年以來積累的、最常用的封裝類和基礎(chǔ)框架等等,我把它們封裝成了一個通用核心代碼庫code,幾乎每個項目都可以引入它,實現(xiàn)快速開發(fā)。接下來的文章我會以一個系列的形式逐漸介紹它。
想要源碼git地址的同學賞個贊唄,它是一個Module,大家可以自行下載依賴。
AppGlobal的介紹
1. AppGlobal的設(shè)計初衷
AppGlobal的設(shè)計初衷:就是為了在任何位置的代碼都可以方便地獲取到一些常用的配置信息或?qū)ο蟆?/p>
- 請記住這兩點初衷: 一是常用、二是方便
2. AppGlobal的初始化:
一般是在Application類的onCreate方法里面進行初始化
AppGlobal.init(context)
.configure()
3. AppGlobal的使用場景:
- 下面舉個栗子:
- 我們實際項目中經(jīng)常用到的一個場景呢,就是線程的切換,例如假設(shè)我們當前實在一個子線程環(huán)境中,我們需要切換到主線程,對UI進行操作,那么就可以使用下面的代碼,通過
AppGlobal.getHandler()獲取到全局共用的Handler對象來進行切換到主線程:
- 我們實際項目中經(jīng)常用到的一個場景呢,就是線程的切換,例如假設(shè)我們當前實在一個子線程環(huán)境中,我們需要切換到主線程,對UI進行操作,那么就可以使用下面的代碼,通過
new Thread(new Runnable() {
@Override
public void run() {
// 假設(shè)當前是子線程環(huán)境
AppGlobal.getHandler().post(new Runnable() {
@Override
public void run() {
// 當前是主線程環(huán)境了,可以操作UI了
}
});
}
}).start();
-
再來一個栗子:
我們APP設(shè)計UI風格的時候,會定一個主題顏色,那么這個主題顏色我們就可以通過AppGlobal保存起來,并且在需要用到的地方,可以通過AppGlobal取出來使用:
-
存儲主題顏色:
AppGlobal.init(this) .withThemeColor(Color.parseColor("#FF0000"))// 存儲主題顏色 .configure(); -
獲取主題顏色:
int themeColor = AppGlobal.getConfiguration(ConfigType.THEME_COLOR);
-
4. 代碼實現(xiàn)細節(jié)
我們回到AppGlobal的初始化代碼這里,在調(diào)用AppGlobal的init方法時,里面會去調(diào)用getConfigurator方法,獲取到一個Configurator對象。
public class AppGlobal {
private static Configurator getConfigurator() {
return Configurator.getInstance();
}
public static Configurator init(Context context) {
return getConfigurator().withApplicationContext(context.getApplicationContext());
}
...
}
我們再進去看下Configurator類的實現(xiàn),進來后,很明顯的看出,Configurator類是采用單例模式的設(shè)計,而它的構(gòu)造方法里呢,會把Handler對象放到一個靜態(tài)Map集合里,我們用到Handler對象的時候呢,其實就是從這個Map對象里拿的,還有其他全局對象,也都是放在這個Map集合里供使用。
public class Configurator {
private static final String TAG = "Configurator";
/**
* 存儲Handler、ApiHost、ApplicationContext等全局通用信息。<br>
* 特別提醒:不適合存放太多東西,最好只存放常用的、內(nèi)存小的對象,不適合放大對象。
*/
private static final Map<Enum<ConfigType>, Object> CONFIGS = new HashMap<>();
/**
* 全局Handler
*/
private static final Handler HANDLER = new Handler();
private static class Holder {
private static final Configurator INSTANCE = new Configurator();
}
public static Configurator getInstance() {
return Holder.INSTANCE;
}
private Configurator() {
CONFIGS.put(ConfigType.CONFIG_READY, false);
CONFIGS.put(ConfigType.HANDLER, HANDLER);
}
public <T> T getConfiguration(Enum<ConfigType> configType) {
checkConfiguration();
return (T) CONFIGS.get(configType);
}
public Configurator configure() {
CONFIGS.put(ConfigType.CONFIG_READY, true);
// 初始化logger
Logger.addLogAdapter(new AndroidLogAdapter());
return this;
}
Configurator withApplicationContext(Context context) {
CONFIGS.put(ConfigType.APPLICATION_CONTEXT, context.getApplicationContext());
return this;
}
public Configurator withApiHost(String apiHost) {
Log.d(TAG, "apiHost: ");
CONFIGS.put(ConfigType.API_HOST, apiHost);
return this;
}
......
}
5. 特別注意一點
Configurator里面的Map不適合存放太多東西,最好只存放常用的、內(nèi)存小的對象,不適合放大對象。
因為它基本是和APP的生命周期一致,所有對象會一直占用著內(nèi)存。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
覺得有用同學,點贊鼓勵下唄。 個人公眾號『Grade桂』,歡迎關(guān)注