介紹
安卓基礎(chǔ)開(kāi)發(fā)庫(kù) :主要包括 網(wǎng)絡(luò)請(qǐng)求、圖片加載、數(shù)據(jù)庫(kù)、事件總線、緩存、權(quán)限管理、工具類(lèi) 模塊。
其中,網(wǎng)絡(luò)請(qǐng)求使用Retrofit+RxJava實(shí)現(xiàn),圖片加載使用Glide實(shí)現(xiàn)(可替換),數(shù)據(jù)庫(kù)使用GreenDao實(shí)現(xiàn)(可替換),事件總線使用EventBus實(shí)現(xiàn)(可替換),權(quán)限管理使用RxPermission實(shí)現(xiàn)。
對(duì)以上提及的框架如果不熟悉,建議先行了解~
具體使用可查看Demo示例,如果覺(jué)得對(duì)你有幫助,不妨點(diǎn)個(gè)★star支持鼓勵(lì)我~
使用說(shuō)明
1. 添加依賴
在項(xiàng)目module下的gradle中添加以下依賴:
compile 'com.ljy.ring:devring:x.x.x' //版本號(hào)請(qǐng)到github確認(rèn)
2. 初始化、配置、構(gòu)建
在Application的onCreate中進(jìn)行初始化、配置、構(gòu)建。
務(wù)必按順序執(zhí)行這三步。
2.1 初始化
DevRing.init(this);
2.2 配置
根據(jù)你的需求進(jìn)行相關(guān)模塊的全局配置,下面將對(duì)每個(gè)配置方法進(jìn)行說(shuō)明。
2.2.1 配置網(wǎng)絡(luò)請(qǐng)求模塊
DevRing.configureHttp()
//設(shè)置BaseUrl
.setBaseUrl(UrlConstants.BASE_URL)
//設(shè)置請(qǐng)求超時(shí)時(shí)長(zhǎng),單位秒
.setConnectTimeout(15)
//是否開(kāi)啟Cookie,默認(rèn)不開(kāi)啟
.setIsUseCookie(true)
//設(shè)置Cookie是否為持久化類(lèi)型
.setIsCookiePersistent(true)
//設(shè)置全局的header信息
.setMapHeader(mapHeader)
//設(shè)置是否啟用緩存,默認(rèn)不啟用
.setIsUseCache(true)
//設(shè)置緩存地址,傳入的file需為文件夾,默認(rèn)保存在/storage/emulated/0/Android/data/com.xxx.xxx/cache/retrofit_http_cache下
.setCacheFolder(file)
//設(shè)置緩存大小,單位byte,默認(rèn)20M
.setCacheSize(size)
//設(shè)置有網(wǎng)絡(luò)時(shí)緩存保留時(shí)長(zhǎng),單位秒,默認(rèn)60秒
.setCacheTimeWithNet(time)
//設(shè)置無(wú)網(wǎng)絡(luò)時(shí)緩存保留時(shí)長(zhǎng),單位秒,默認(rèn)一周
.setCacheTimeWithoutNet(time)
//設(shè)置是否開(kāi)啟失敗重試功能,目前僅支持普通的網(wǎng)絡(luò)請(qǐng)求,上傳下載不支持。默認(rèn)不開(kāi)啟
.setIsUseRetryWhenError(true)
//設(shè)置失敗后重試的最大次數(shù),默認(rèn)3次
.setMaxRetryCount(2)
//設(shè)置失敗后重試的延遲時(shí)長(zhǎng),單位秒,默認(rèn)3秒
.setTimeRetryDelay(5)
//設(shè)置是否開(kāi)啟Log,默認(rèn)不開(kāi)啟
.setIsUseLog(true);
如果以上的配置無(wú)法滿足你的要求,那么可以通過(guò)以下方法獲取相關(guān)Builder進(jìn)行具體定制(不需要調(diào)用Builder的build()方法,后面發(fā)起網(wǎng)絡(luò)請(qǐng)求時(shí)內(nèi)部會(huì)自動(dòng)進(jìn)行build操作。)
//獲取OkHttpClient.Builder
DevRing.configureHttp().getOkHttpClientBuilder().xxx();
//獲取Retrofit.Builder
DevRing.configureHttp().getRetrofitBuilder().xxx();
2.2.2 配置圖片加載模塊
DevRing.configureImage()
//設(shè)置“加載中”狀態(tài)時(shí)顯示的圖片
.setLoadingResId(R.mipmap.ic_image_load)
//設(shè)置“加載失敗”狀態(tài)時(shí)顯示的圖片
.setErrorResId(R.mipmap.ic_image_load)
//設(shè)置是否開(kāi)啟狀態(tài)切換時(shí)的過(guò)渡動(dòng)畫(huà),默認(rèn)false
.setIsShowTransition(true)
//設(shè)置是否使用okhttp3作為網(wǎng)絡(luò)組件,默認(rèn)true
.setIsUseOkhttp(false)
//設(shè)置內(nèi)存緩存大小,不建議設(shè)置,使用框架默認(rèn)設(shè)置的大小即可
.setMemoryCacheSize(size)
//設(shè)置Bitmap池大小,設(shè)置內(nèi)存緩存大小的話一般這個(gè)要一起設(shè)置,不建議設(shè)置,使用框架默認(rèn)設(shè)置的大小即可
.setBitmapPoolSize(size)
//設(shè)置磁盤(pán)緩存地址是否在外部存儲(chǔ)中,默認(rèn)false
.setIsDiskCacheExternal(true)
//設(shè)置具體的磁盤(pán)緩存地址,傳入的file需為文件夾
.setDiskCacheFile(file)
//設(shè)置磁盤(pán)緩存大小,單位byte,默認(rèn)250M
.setDiskCacheSize(200*1024*1024);
如果你需要替換默認(rèn)實(shí)現(xiàn)的圖片框架(Glide),那么
- 創(chuàng)建圖片管理者類(lèi),要求實(shí)現(xiàn)IImageManager接口
- 通過(guò)DevRing.configureImage(IImageManager)方法傳入圖片管理者類(lèi)
- 傳入后和上面一樣可以進(jìn)行相關(guān)配置。
DevRing.configureImage(new FrescoManager())
.setXXX()
...
.setXXXX();
具體可查看Demo,演示了如何使用Fresco替換Glide
替換為Fresco后,相關(guān)的ImageView需換成SimpleDraweeView。
2.2.3 配置事件總線模塊
DevRing.configureBus()//配置默認(rèn)的EventBus
//設(shè)置用于加速的Index,具體生成方法請(qǐng)參考我的那篇EventBus介紹
.setIndex(new MyEventBusIndex())
//設(shè)置是否使用index進(jìn)行加速
.setIsUseIndex(true);
如果你需要替換默認(rèn)實(shí)現(xiàn)的事件總線框架(EventBus),那么
- 創(chuàng)建事件總線管理者類(lèi),要求實(shí)現(xiàn)IBusManager接口
- 通過(guò)DevRing.configureBus(IBusManager)方法傳入事件總線管理者類(lèi)
DevRing.configureBus(new RxBusManager());
具體可查看Demo,演示了如何使用RxBus替換EventBus
2.2.4 配置數(shù)據(jù)庫(kù)模塊
由于GreenDao的特殊性以及具體數(shù)據(jù)表的不確定,無(wú)法很好地集成到DevRing當(dāng)中。
所以需要進(jìn)行如下操作:
- 創(chuàng)建數(shù)據(jù)庫(kù)管理者類(lèi),要求實(shí)現(xiàn)IDBManager接口
- 通過(guò)DevRing.configureDB(IDBManager)方法傳入數(shù)據(jù)庫(kù)管理者。
- DevRing中已提供了GreenDao的一些輔助類(lèi),如數(shù)據(jù)表管理者基類(lèi),以及用于數(shù)據(jù)庫(kù)升級(jí)遷移數(shù)據(jù)的OpenHelper。
所以創(chuàng)建起來(lái)不會(huì)復(fù)雜,具體過(guò)程請(qǐng)參考Demo
DevRing.configureDB(new GreenDBManager());
使用其他數(shù)據(jù)庫(kù)的話,也同樣是通過(guò)DevRing.configureDB(IDBManager)方法傳入數(shù)據(jù)庫(kù)管理者。
Demo中演示了如何使用原生的數(shù)據(jù)庫(kù)替換GreenDao
DevRing.configureDB(new NativeDBManager());
2.2.5 配置緩存模塊
DevRing.configureCache()
//設(shè)置磁盤(pán)緩存最大緩存大小,單位為byte,默認(rèn)無(wú)上限
.setDiskCacheMaxSize(50*1024*1024)
//設(shè)置磁盤(pán)緩存的文件夾數(shù)量上限,默認(rèn)無(wú)上限
.setDiskCacheMaxCount(10)
//配置磁盤(pán)緩存的地址,傳入的File需為文件夾,默認(rèn)保存在/data/user/0/com.xxx.xxx/cache下
.setDiskCacheFolder(file);
2.2.6 配置其他模塊
DevRing.configureOther()
//設(shè)置是否開(kāi)啟崩潰日志功能,默認(rèn)不開(kāi)啟
.setIsUseCrashDiary(true)
//設(shè)置崩潰日志的輸出地址,傳入的file需為文件夾,默認(rèn)保存在/storage/emulated/0/Android/data/com.xxx.xxx/cache/crash_log下
.setCrashDiaryFolder(file)
//設(shè)置是否顯示Ringlog打印的內(nèi)容,默認(rèn)true
.setIsShowRingLog(true)
//設(shè)置Toast樣式,不設(shè)置的話則采用系統(tǒng)默認(rèn)的Toast效果
//toastStyle的實(shí)現(xiàn)可參考庫(kù)中自帶的ToastBlackStyle,或者Demo中的CustomToastStyle
//如果需要在具體場(chǎng)景中動(dòng)態(tài)切換樣式,調(diào)用RingToast.initStyle(toastStyle)即可
.setToastStyle(toastStyle);
2.3 構(gòu)建
DevRing.create();
3. 開(kāi)始調(diào)用
幾大模塊都是通過(guò)DevRing.xxxManager()得到管理者,然后進(jìn)行具體操作。
3.1 網(wǎng)絡(luò)請(qǐng)求模塊
3.1.1 獲取Retrofit的請(qǐng)求API接口
DevRing.httpManager().getService(XXXApiService.class);
比如:獲取用于登錄請(qǐng)求的Observable
Observable observable = DevRing.httpManager().getService(UserApiService.class).login();
3.1.2 普通請(qǐng)求
DevRing.httpManager().commonRequest(observable, new CommonObserver<HttpResult<List<MovieRes>>>() {
@Override
public void onResult(HttpResult<List<MovieRes>> result) {
}
@Override
public void onError(HttpThrowable throwable){
}
}, TAG);
調(diào)用commonRequest()方法發(fā)起普通請(qǐng)求
- 參數(shù)1為普通的網(wǎng)絡(luò)請(qǐng)求Observable,如3.1.1中的登錄請(qǐng)求Observable。
- 參數(shù)2為請(qǐng)求回調(diào)Observer。
- 庫(kù)中提供了CommonObserver,對(duì)異常信息進(jìn)行了簡(jiǎn)單封裝。
- 參數(shù)3可傳入String類(lèi)型的Tag來(lái)控制生命周期(終止網(wǎng)絡(luò)請(qǐng)求)
- 例如傳入"yourTag",當(dāng)想要手動(dòng)終止該請(qǐng)求時(shí),調(diào)用DevRing.httpManager().stopRequestByTag("yourTag"); 即可
- 參數(shù)3也可傳入用于控制生命周期的LifecycleTransformer。
- 可通過(guò)RxLifecycleUtil來(lái)獲取與頁(yè)面生命周期綁定的LifecycleTransformer。
- 例如傳入RxLifecycleUtil.bindUntilEvent(lifeEmitter, FragmentEvent.DESTROY)),則表示該請(qǐng)求會(huì)在Fragment Destroy時(shí)銷(xiāo)毀。其中l(wèi)ifeEmitter須實(shí)現(xiàn)IBaseFragment接口。
- 例如傳入RxLifecycleUtil.bindUntilEvent(lifeEmitter, ActivityEvent.DESTROY)),則表示該請(qǐng)求會(huì)在Activity Destroy時(shí)銷(xiāo)毀。其中l(wèi)ifeEmitter須實(shí)現(xiàn)IBaseActivity接口。
- 你也可以使用RxLifecycleUtil.RxBindUntilEvent(Observable<R> lifecycleable, R event)方法來(lái)獲取,其中l(wèi)ifecycleable為事件發(fā)射者,event用于指定銷(xiāo)毀的事件(時(shí)機(jī))。 涉及RxJava,不了解的可以先查看Retrofit+RxJava的生命周期控制部分。
- 傳入null 則表示不對(duì)該請(qǐng)求進(jìn)行生命周期控制
3.1.3 上傳請(qǐng)求,可監(jiān)聽(tīng)進(jìn)度
DevRing.httpManager().uploadRequest(observable, new UploadObserver(UrlConstants.UPLOAD) {
@Override
public void onResult(Object result) {
}
@Override
public void onError(long progressInfoId, HttpThrowable throwable) {
}
@Override
public void onProgress(ProgressInfo progressInfo) {
}
}, TAG);
調(diào)用uploadRequest()方法發(fā)起上傳請(qǐng)求
- 參數(shù)1為上傳的網(wǎng)絡(luò)請(qǐng)求Observable。
- 參數(shù)2為上傳的請(qǐng)求回調(diào)UploadObserver,可用于監(jiān)聽(tīng)上傳進(jìn)度。
- 如果不需要監(jiān)聽(tīng)上傳進(jìn)度,則使用空的構(gòu)造函數(shù),或者使用3.1.2的commonRequest
- 如果是普通地監(jiān)聽(tīng)某個(gè)上傳的進(jìn)度,則使用一個(gè)參數(shù)的構(gòu)造函數(shù),并傳入上傳的URL地址
- 如果是使用同一個(gè)URL但根據(jù)請(qǐng)求參數(shù)的不同而上傳不同資源的情況,則使用兩個(gè)參數(shù)的構(gòu)造函數(shù),第一個(gè)參數(shù)傳入上傳的URL地址,第二參數(shù)傳入自定義的字符串加以區(qū)分。
- onProgress(ProgressInfo progressInfo) 中獲取進(jìn)度信息
- onError(long progressInfoId, String errMessage) 中的progressInfoId為0,則為請(qǐng)求相關(guān)的異常,如果不為0,則為上傳讀寫(xiě)過(guò)程的異常
- 參數(shù)3在 3.1.2中已作了說(shuō)明
3.1.4 下載請(qǐng)求,可監(jiān)聽(tīng)進(jìn)度
DevRing.httpManager().downloadRequest(file, observable, new DownloadObserver(UrlConstants.DOWNLOAD) {
@Override
public void onResult(boolean isSaveSuccess, String filePath) {
}
@Override
public void onError(long progressInfoId, HttpThrowable throwable) {
}
@Override
public void onProgress(ProgressInfo progressInfo) {
}
}, TAG);
調(diào)用downloadRequest()方法發(fā)起下載請(qǐng)求
- 參數(shù)1為目標(biāo)保存文件,下載的內(nèi)容將保存于此。
- 參數(shù)2為下載的網(wǎng)絡(luò)請(qǐng)求Observable。
- 參數(shù)3為下載的請(qǐng)求回調(diào)DownloadObserver,可用于監(jiān)聽(tīng)下載進(jìn)度。
- 如果不需要監(jiān)聽(tīng)下載進(jìn)度,則使用空的構(gòu)造函數(shù),或者使用3.1.2的commonRequest
- 如果是普通地監(jiān)聽(tīng)某個(gè)下載的進(jìn)度,則使用一個(gè)參數(shù)的構(gòu)造函數(shù),并傳入下載的URL地址
- 如果是使用同一個(gè)URL但根據(jù)請(qǐng)求參數(shù)的不同而下載不同資源的情況,則使用兩個(gè)參數(shù)的構(gòu)造函數(shù),第一個(gè)參數(shù)傳入下載的URL地址,第二參數(shù)傳入自定義的字符串加以區(qū)分。
- onResult(boolean isSaveSuccess, String filePath) 中的isSaveSuccess表示是否成功保存到目標(biāo)文件中,filePath為目標(biāo)文件的絕對(duì)路徑。
- onProgress(ProgressInfo progressInfo) 中獲取進(jìn)度信息
- onError(long progressInfoId, String errMessage) 中的progressInfoId為0,則為請(qǐng)求相關(guān)的異常,如果不為0,則為下載讀寫(xiě)過(guò)程的異常
- 參數(shù)4在 3.1.2中已作了說(shuō)明
下載方面并沒(méi)提供"多線程下載"、"斷點(diǎn)續(xù)傳"的功能。
如果需要的話,這里推薦github上的下載框架FileDownloader1,FileDownloader2。
3.1.5 刷新管理者
如果你在2.2配置初始化后,需要對(duì)Http的全局配置進(jìn)行修改,
請(qǐng)?jiān)谛薷呐渲煤笳{(diào)用DevRing.httpManager().refreshInstance(); 進(jìn)行刷新,
它將根據(jù)你最新的Http配置進(jìn)行重新構(gòu)建。
3.2 圖片加載模塊
3.2.1 普通加載圖片
DevRing.imageManager().loadNet(url, imageView); //加載網(wǎng)絡(luò)圖片到控件
DevRing.imageManager().loadRes(resId, imageView);//加載res資源圖片到控件
DevRing.imageManager().loadAsset(assetName, imageView);//加載asset資源圖片到控件
DevRing.imageManager().loadFile(file, imageView);//加載本地圖片文件到控件
- 將自動(dòng)使用 2.2.2 配置的“加載中顯示的圖片”,“加載失敗顯示的圖片”,“是否開(kāi)啟過(guò)渡效果” 來(lái)進(jìn)行加載。
3.2.2 定制化加載圖片
相比3.2.1,多了一個(gè)LoadOption參數(shù),用于設(shè)置加載選項(xiàng)。
//加載圖片,并應(yīng)用圓角、模糊、灰白效果。
DevRing.imageManager().loadXXX(url, imageView, new LoadOption().setRoundRadius(80).setIsGray(true).setBlurRadius(5));
LoadOption目前支持設(shè)置
- 加載中狀態(tài)顯示的圖片
- 加載失敗狀態(tài)顯示的圖片
- 是否開(kāi)啟狀態(tài)切換時(shí)的過(guò)渡動(dòng)畫(huà)
- 是否加載為圓形圖片
- 加載為圓角圖片的圓角值
- 加載為模糊圖片的模糊值
- 是否加載為灰白圖片
- 邊框的顏色與粗細(xì)(目前僅支持圓形模式)
3.2.3 預(yù)加載圖片
DevRing.imageManager().preLoad(url);
3.2.4 獲取網(wǎng)絡(luò)圖片的Bitmap
DevRing.imageManager().getBitmap(context, url, new ImageListener<Bitmap>(){
@Override
public void onSuccess(Bitmap result) {
//獲取成功,回調(diào)在主線程
}
@Override
public void onFail(Throwable throwable) {
//獲取失敗,回調(diào)在主線程
}
});
3.2.5 下載圖片到指定文件
DevRing.imageManager().downLoadImage(context, url, file, new ImageListener<File>(){
@Override
public void onSuccess(File result) {
//下載成功,回調(diào)在后臺(tái)線程
}
@Override
public void onFail(Throwable throwable) {
//下載失敗,回調(diào)在后臺(tái)線程
}
});
3.2.6 清空內(nèi)存緩存
DevRing.imageManager().clearMemoryCache();
3.2.7 清空磁盤(pán)緩存
DevRing.imageManager().clearDiskCache();
3.2.8 調(diào)用接口以外的方法
如果圖片管理者中定義了IImageManager接口以外的方法,可以通過(guò)傳入具體類(lèi)型來(lái)調(diào)用,如下:
DevRing.<FrescoManager>imageManager().xxx();
3.3 事件總線模塊
3.3.1 訂閱
DevRing.busManager().register(subscriber);
3.3.2 解除訂閱
DevRing.busManager().unregister(subscriber);
3.3.3 發(fā)送普通事件
DevRing.busManager().postEvent(event);
3.3.4 發(fā)送粘性事件
DevRing.busManager().postStickyEvent(event);
3.3.5 調(diào)用接口以外的方法
如果事件總線管理者中定義了IBusManager接口以外的方法,可以通過(guò)傳入具體類(lèi)型來(lái)調(diào)用,如下。
DevRing.<EventBusManager>busManager().cancelDelivery(event);
3.4 數(shù)據(jù)庫(kù)模塊
需先在數(shù)據(jù)庫(kù)管理者(實(shí)現(xiàn)IDBManager接口)中的putTableManager()方法里,將數(shù)據(jù)表管理者通過(guò)(kye,value)方式放進(jìn)Map中。
public class GreenDBManager implements IDBManager {
MovieTableManager mMovieTableManager;
.....
@Override
public void putTableManager(SimpleArrayMap<Object, ITableManger> mapTables) {
mapTables.put(Movie.class, mMovieTableManager);
}
}
其中的MovieTableManager 是實(shí)現(xiàn)了ITableManger的數(shù)據(jù)表管理者。
如果你數(shù)據(jù)庫(kù)模塊的實(shí)現(xiàn)也使用GreenDao框架,那么可以繼承Devring中提供的數(shù)據(jù)表管理者基類(lèi)GreenTableManager,重寫(xiě)getDao()方法返回自動(dòng)生成的對(duì)應(yīng)表的Dao類(lèi),即可快速完成數(shù)據(jù)表管理者的創(chuàng)建。具體過(guò)程請(qǐng)參考Demo。
然后通過(guò)key值獲取對(duì)應(yīng)的數(shù)據(jù)表管理者,并進(jìn)行增刪改查等操作。
DevRing.tableManager(Movie.class).xxx();
3.4.1 增
DevRing.tableManager(key).insertOne(object); //插入一個(gè)數(shù)據(jù)
DevRing.tableManager(key).insertSome(list); //插入多個(gè)數(shù)據(jù)
DevRing.tableManager(key).insertOrReplaceOne(object); //插入一個(gè)數(shù)據(jù),如果已存在則進(jìn)行替換,根據(jù)主鍵來(lái)判斷是否已存在
DevRing.tableManager(key).insertOrReplaceSome(list); //插入多個(gè)數(shù)據(jù),如果已存在則進(jìn)行替換,根據(jù)主鍵來(lái)判斷是否已存在
3.4.2 刪
DevRing.tableManager(key).deleteOne(object); //刪除一個(gè)數(shù)據(jù)
DevRing.tableManager(key).deleteSome(list); //刪除多個(gè)數(shù)據(jù)
DevRing.tableManager(key).deleteOneByKey(primarykey); //根據(jù)主鍵刪除一個(gè)數(shù)據(jù)
DevRing.tableManager(key).deleteSomeByKeys(listPrimarykey); //根據(jù)主鍵刪除多個(gè)數(shù)據(jù)
DevRing.tableManager(key).deleteAll(); //刪除表中所有數(shù)據(jù)
3.4.3 改
DevRing.tableManager(key).updateOne(object); //更新一個(gè)數(shù)據(jù)
DevRing.tableManager(key).updateSome(list); //更新多個(gè)數(shù)據(jù)
3.4.4 查
DevRing.tableManager(key).loadOne(primarykey); //根據(jù)主鍵獲取一個(gè)數(shù)據(jù)
DevRing.tableManager(key).loadAll(); //獲取全部數(shù)據(jù)
DevRing.tableManager(key).count(); //獲取表數(shù)據(jù)的數(shù)量
DevRing.tableManager(key).rawQuery(sql, selectionArgs); //條件查詢
3.4.5 執(zhí)行SQL語(yǔ)句
DevRing.tableManager(key).execSQL(sql); //執(zhí)行SQL語(yǔ)句
3.4.6 調(diào)用接口以外的方法
如果表管理者中定義了ITableManager接口以外的方法,可以通過(guò)傳入具體類(lèi)型來(lái)調(diào)用。
例如:GreenTableManager中另外定義了queryBuilder()方法,用于各種更高級(jí)查詢,
具體可查看我的那篇GreenDao使用介紹。
DevRing.<GreenTableManager>tableManager().queryBuilder().list();
3.5 緩存模塊
3.5.1 內(nèi)存緩存
DevRing.cacheManager().memoryCache().put(key, object); //存入數(shù)據(jù)
DevRing.cacheManager().memoryCache().get(key); //取出數(shù)據(jù)
DevRing.cacheManager().memoryCache().remove(key); //移除數(shù)據(jù)
DevRing.cacheManager().memoryCache().contains(key); //是否包key值對(duì)應(yīng)的數(shù)據(jù)
DevRing.cacheManager().memoryCache().clear(); //清空所有數(shù)據(jù)
3.5.2 磁盤(pán)緩存,可指定緩存時(shí)長(zhǎng)
DevRing.cacheManager().diskCache(name).put(key, object); //存入數(shù)據(jù)
DevRing.cacheManager().diskCache(name).put(key, object, saveTime); //存入數(shù)據(jù),并指定緩存時(shí)長(zhǎng)
DevRing.cacheManager().diskCache(name).getXXX(key); //取出數(shù)據(jù)
DevRing.cacheManager().diskCache(name).remove(key); //移除數(shù)據(jù)
DevRing.cacheManager().diskCache(name).getCacheCount(); //獲取已緩存的數(shù)量
DevRing.cacheManager().diskCache(name).getCacheSize(); //獲取已緩存的空間大小
DevRing.cacheManager().diskCache(name).clear(); //清空所有數(shù)據(jù)
3.5.3 SharedPreference
DevRing.cacheManager().spCache(name).put(key, object); //存入數(shù)據(jù)
DevRing.cacheManager().spCache(name).getXXX(key); //取出數(shù)據(jù)
DevRing.cacheManager().spCache(name).getAll(); //取出全部數(shù)據(jù)
DevRing.cacheManager().spCache(name).remove(key); //移除數(shù)據(jù)
DevRing.cacheManager().spCache(name).clear(); //清空所有數(shù)據(jù)
3.6 權(quán)限管理模塊
DevRing.permissionManager().requestEachCombined(activity, new PermissionListener() {
@Override
public void onGranted(String permissionName) {
//如果全部權(quán)限都被授予
}
@Override
public void onDenied(String permissionName) {
//如果用戶拒絕了其中一個(gè)授權(quán)請(qǐng)求
}
@Override
public void onDeniedWithNeverAsk(String permissionName) {
//如果用戶拒絕了其中一個(gè)授權(quán)請(qǐng)求,且勾選了不再提醒,則需要引導(dǎo)用戶到權(quán)限管理頁(yè)面開(kāi)啟
}
}, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA);
- 還提供了一個(gè)requestEach()方法,參數(shù)都一樣。
- 如果要求申請(qǐng)的權(quán)限全都授予才能使用某功能的話,建議使用requestEachCombined()方法來(lái)申請(qǐng)。
3.7 Activity管理模塊
改自JessYan的AppManager
DevRing.activityListManager().addActivity(activity); //存進(jìn)一個(gè)activity
DevRing.activityListManager().removeActivity(activity); //移除一個(gè)activity
DevRing.activityListManager().getCurrentActivity(); //獲取在前臺(tái)的activity
DevRing.activityListManager().getTopActivity(); //獲取最近啟動(dòng)的的activity
DevRing.activityListManager().getActivityList(); //獲取存放activity的list
DevRing.activityListManager().killActivity(class); //關(guān)閉指定class的所有activity
DevRing.activityListManager().activityInstanceIsLive(activity); //指定的activity實(shí)例是否存活
DevRing.activityListManager().activityClassIsLive(class); //指定class的activity是否存活(同一個(gè) class可能有多個(gè)activity實(shí)例)
DevRing.activityListManager().findActivity(class); //獲取指定class的activity,沒(méi)有則返回 null (同一個(gè)class有多個(gè)實(shí)例,則返回最早創(chuàng)建的實(shí)例)
DevRing.activityListManager().killAll(); //關(guān)閉所有activity
DevRing.activityListManager().killAllExclude(class); //關(guān)閉除了指定class的activity以外的所有activity
DevRing.activityListManager().exitApp(); //關(guān)閉所有頁(yè)面并退出應(yīng)用
3.8 LifeCycleCallback
提供了ActivityLifeCallback 和 FragmentLifeCallback,以實(shí)現(xiàn)基類(lèi)的功能。
只需Activity實(shí)現(xiàn)IBaseActivity接口即可完成相關(guān)的基類(lèi)操作。
只需Fragment實(shí)現(xiàn)IBaseFragment接口即可完成相關(guān)的基類(lèi)操作。
具體請(qǐng)查看關(guān)于基類(lèi)的那些事 以及項(xiàng)目代碼
3.9 工具類(lèi)
3.9.1 RingLog
可定位輸出位置的Log
RingLog.e(TAG, message); //比如打印Error級(jí)日志
RingLog.json(TAG, jsonString);//將jsonString格式化后打印出來(lái)
RingLog.xml(TAG, xmlString);//將xmlString格式化后打印出來(lái)
...
3.9.2 RingToast
吐司工具類(lèi),新版修改自ToastUtils
RingToast.show("hello world");
RingToast.show(R.string.appName);
RingToast.show(1234);
//動(dòng)態(tài)修改吐司樣式,IToastStyle的實(shí)現(xiàn)可參考庫(kù)中提供的ToastBlackStyle,或者Demo中的CustomToastStyle
RingToast.initStyle(IToastStyle)
3.9.3 UltimateBar
狀態(tài)欄/導(dǎo)航欄顏色工具類(lèi)。
來(lái)自UltimateBar,具體用法到里面查閱。
3.9.4 FileUtil
文件工具類(lèi)
FileUtil.getUriForFile(context, file); //根據(jù)file獲取uri,適配7.0系統(tǒng)
FileUtil.isSDCardAvailable(); //SD卡是否能用
FileUtil.getDirectory(parentDirectory, directory); //獲取文件夾
FileUtil.getFile(parentDirectory, name); //獲取文件
FileUtil.getFile(filePath); //獲取文件
FileUtil.deleteFile(file); //刪除文件
FileUtil.calculateFileSize(file); //計(jì)算文件大小
FileUtil.copyFile(source, target); //復(fù)制文件
FileUtil.saveFile(inputStream, outputStream); //保存文件
....更多方法請(qǐng)查看代碼
3.9.5 ImageUitl
圖片工具類(lèi).
用于對(duì)圖片進(jìn)行壓縮(比例壓縮 / 質(zhì)量壓縮)、跳轉(zhuǎn)到相機(jī)/相冊(cè)、對(duì)Bitmap做高斯模糊處理等。
ImageUtil.getImageFromCamera(activity, uri); //使用相機(jī)拍照并保存到指定位置
ImageUtil.getImageFromAlbums(activity); //從手機(jī)相冊(cè)中獲取照片
ImageUtil.cropImage(activity, cropWidth, cropHeight, photoUri, fileToSave); //使用系統(tǒng)的裁剪圖片,并保存至指定位置
ImageUtil.scaleCompress(res/filePath/bitmap, width, height); //按比例壓縮,返回bitmap
ImageUtil.qualityCompress(bitmap, maxSize); //質(zhì)量壓縮,直至圖片不大于maxSize
ImageUtil.saveBitmapToFile(bitmap, file); //保存圖片到文件
....更多方法請(qǐng)查看代碼
3.9.6 NetworkUtil
網(wǎng)絡(luò)狀態(tài)工具類(lèi)
NetworkUtil.isNetWorkAvailable(context); //當(dāng)前網(wǎng)絡(luò)是否可用
NetworkUtil.getNetWorkType(context); //獲取當(dāng)前網(wǎng)絡(luò)類(lèi)型
NetworkUtil.isWifiConnected(context); //當(dāng)前是否為WIFI連接
NetworkUtil.isMobileConnected(context); //當(dāng)前是否為移動(dòng)網(wǎng)絡(luò)
NetworkUtil.getAPNType(context); //獲取apn類(lèi)型
3.9.7 ConfigUtil
配置相關(guān)的工具類(lèi)
ConfigUtil.getScreenSize(context); //獲取屏幕寬高的int數(shù)組
ConfigUtil.getScreenLongSide(context); //獲取屏幕的長(zhǎng)邊(即豎屏下的高,橫屏下的寬)
ConfigUtil.getScreenShortSide(context); //獲取屏幕的短邊(即豎屏下的寬,橫屏下的高)
ConfigUtil.getStatusBarHeight(context); //獲取狀態(tài)欄高度
ConfigUtil.getNavigationBarHeight(context); //獲取底部導(dǎo)航欄高度
ConfigUtil.isApkInDebug(context); //判斷當(dāng)前應(yīng)用是否是debug模式
3.9.8 FontTypeUtil
修改各控件(TextView,Button,EditText,CheckBox,RadioButton等)中字體樣式的工具類(lèi)
在activity的基類(lèi)中調(diào)用
FontTypeUtil.replaceFont(context, "fonts/FZLanTYJW.ttf"); // 第二個(gè)參數(shù)為assert文件夾下的字體文件
或者在Application中調(diào)用
FontTypeUtil.replaceSystemDefaultFont(context, "fonts/FZLanTYJW.ttf"); // 第二個(gè)參數(shù)為assert文件夾下的字體文件
另外,在你的APP主題的style中設(shè)置
<style name="AppTheme" parent="...">
.....
<item name="android:typeface">monospace</item>
</style>
3.9.9 KeyboardUtil
軟鍵盤(pán)工具類(lèi)。
- 處理鍵盤(pán)遮擋EditText的問(wèn)題:
在activity的onCreate中調(diào)用
@Override
protected void onCreate(Bundle savedInstanceState) {
KeyboardUtil.fixInput(this, isFullScreen); //第二個(gè)參數(shù)為當(dāng)前頁(yè)面是否為全屏模式
}
- 點(diǎn)擊鍵盤(pán)外部收起鍵盤(pán):
在activity的dispatchTouchEvent中調(diào)用
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
KeyboardUtil.handleKeyboardHide(this, ev);
return super.dispatchTouchEvent(ev);
}
注意事項(xiàng)
- 配置參數(shù)為File時(shí),請(qǐng)自行確保對(duì)傳入的File具有可讀寫(xiě)權(quán)限。
- 部分框架需忽略混淆,具體的混淆配置請(qǐng)參考Demo中app下的proguard-rules.pro文件。
- DevRing庫(kù)中AndroidManifest已添加了網(wǎng)絡(luò)權(quán)限,所以主項(xiàng)目不必重復(fù)添加。
- DevRing庫(kù)中已添加了Glide,EventBus,GreenDao,Dagger2,Retrofit2,RxJava2,RxAndroid2,RxLifeCycle2,RxPermission2的依賴,所以主項(xiàng)目不必重復(fù)添加。
- 可以通過(guò)exclude移除DevRing庫(kù)中相關(guān)框架的依賴以減小包體積。 例如:
api ('com.ljy.ring:devring:x.x.x'){
//如果不需使用圖片加載模塊或者該模塊不使用Glide實(shí)現(xiàn),那么可以加上這句移除Devring庫(kù)中對(duì)Glide的依賴以減小包體積
exclude module: 'glide'
//如果不需使用事件總線模塊或者該模塊不使用EventBus實(shí)現(xiàn),那么可以加上這句移除Devring庫(kù)中對(duì)EventBus的依賴以減小包體積
exclude module: 'eventbus'
//如果不需使用數(shù)據(jù)庫(kù)模塊或者該模塊不使用GreenDao實(shí)現(xiàn),那么可以加上這句移除Devring庫(kù)中對(duì)GreenDao的依賴以減小包體積
exclude module: 'greendao'
}
有什么問(wèn)題或建議,歡迎提issue或者簡(jiǎn)信告知~