安卓基礎(chǔ)開(kāi)發(fā)庫(kù),DevRing使用說(shuō)明

https://github.com/LJYcoder/DevRing

介紹

安卓基礎(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),那么

  1. 創(chuàng)建圖片管理者類(lèi),要求實(shí)現(xiàn)IImageManager接口
  2. 通過(guò)DevRing.configureImage(IImageManager)方法傳入圖片管理者類(lèi)
  3. 傳入后和上面一樣可以進(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),那么

  1. 創(chuàng)建事件總線管理者類(lèi),要求實(shí)現(xiàn)IBusManager接口
  2. 通過(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)行如下操作:

  1. 創(chuàng)建數(shù)據(jù)庫(kù)管理者類(lèi),要求實(shí)現(xiàn)IDBManager接口
  2. 通過(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上的下載框架FileDownloader1FileDownloader2

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)

  1. 配置參數(shù)為File時(shí),請(qǐng)自行確保對(duì)傳入的File具有可讀寫(xiě)權(quán)限。
  2. 部分框架需忽略混淆,具體的混淆配置請(qǐng)參考Demo中app下的proguard-rules.pro文件。
  3. DevRing庫(kù)中AndroidManifest已添加了網(wǎng)絡(luò)權(quán)限,所以主項(xiàng)目不必重復(fù)添加。
  4. DevRing庫(kù)中已添加了Glide,EventBus,GreenDao,Dagger2,Retrofit2,RxJava2,RxAndroid2,RxLifeCycle2,RxPermission2的依賴,所以主項(xiàng)目不必重復(fù)添加。
  5. 可以通過(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)信告知~


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,486評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,852評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,600評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,944評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,108評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,385評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,616評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,798評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,205評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,537評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,334評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,570評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,828評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,752評(píng)論 25 708
  • 分享人:黃華英 OpenLayers 為了調(diào)用map,需要做3件事情: 調(diào)用OpenLayers map容器 Ja...
    胡諾閱讀 493評(píng)論 0 1
  • 小玉喜歡留長(zhǎng)發(fā),因此十分注意對(duì)頭發(fā)的保養(yǎng),洗頭膏,護(hù)發(fā)素是必不可少的,她的頭發(fā)是自然的棕褐色,再配上小玉白皙的臉蛋...
    夜的第七章jx閱讀 1,906評(píng)論 0 3
  • 愛(ài)情是那么美的一個(gè)詞,美到讓人失去理智。但是這種美就像瓶里的鮮花,時(shí)間久了,營(yíng)養(yǎng)跟不上了,也就枯萎了。 被一個(gè)男人...
    何以笙歌閱讀 167評(píng)論 0 0