https://github.com/LJYcoder/DevRing
经过最近的努力,将几个常用框架进行了封装,并抽成了一个安卓基础开发库 。
主要包括 网络请求、图片加载、数据库、事件总线、缓存、权限管理、工具类 模块。
其中,网络请求使用Retrofit+RxJava实现,图片加载使用Glide实现(可替换),数据库使用GreenDao实现(可替换),事件总线使用EventBus实现(可替换),权限管理使用RxPermission实现。
Demo采用MVP+Dagger2进行开发,演示了各模块的使用。
对以上提及的框架如果不熟悉,建议先了解下~
如果觉得不错,不妨点个star。你的支持,是我开源的动力~
在项目module下的gradle中添加以下依赖:
compile 'com.ljy.ring:devring:1.0.4'
由于数据库、图片加载、事件总线模块支持替换其默认实现的框架,
所以库中对GreenDao,Glide,EventBus的依赖是使用compileOnly(仅在编译时依赖),这么做是为了避免被替换的框架依然参与打包,从而增加了apk大小。
也就是说,对于这三个模块,当你需要使用相关框架时,还需添加其依赖。
如果要使用Devring库的图片加载模块(默认Glide),那么需要添加Glide依赖
compile 'com.github.bumptech.glide:glide:4.4.0'
如果要使用Devring库的数据库模块(默认GreenDao),那么需要添加GreenDao依赖
//Project下的build.gradle文件中加入
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
//Module下的build.gradle文件中加入
apply plugin: 'org.greenrobot.greendao'
compile 'org.greenrobot:greendao:3.2.0'
如果要使用Devring库的事件总线模块(默认EventBus),那么需要添加EventBus依赖
compile 'org.greenrobot:eventbus:3.0.0'
在Application的onCreate中进行初始化、配置、构建。
务必按顺序执行这三步。
DevRing.init(this);
根据你的需求进行相关模块的全局配置,下面将对每个配置方法进行说明。
DevRing.configureHttp()
//设置BaseUrl
.setBaseUrl(UrlConstants.BASE_URL)
//设置请求超时时长,单位秒
.setConnectTimeout(15)
//设置全局的header信息
.setMapHeader(mapHeader)
//设置是否启用缓存,默认不启用
.setIsUseCache(true)
//设置缓存地址,传入的file需为文件夹,默认保存在/storage/emulated/0/Android/data/com.xxx.xxx/cache/retrofit_http_cache下
.setCacheFolder(file)
//设置缓存大小,单位byte,默认20M
.setCacheSize(size)
//设置有网络时缓存保留时长,单位秒,默认60秒
.setCacheTimeWithNet(time)
//设置无网络时缓存保留时长,单位秒,默认一周
.setCacheTimeWithoutNet(time)
//设置是否开启失败重试功能,目前仅支持普通的网络请求,上传下载不支持。默认不开启
.setIsUseRetryWhenError(true)
//设置失败后重试的最大次数,默认3次
.setMaxRetryCount(2)
//设置失败后重试的延迟时长,单位秒,默认3秒
.setTimeRetryDelay(5)
//设置是否开启Log,默认不开启
.setIsUseLog(true);
如果以上的配置无法满足你的要求,那么可以通过以下方法获取相关Builder进行具体定制
//获取OkHttpClient.Builder
DevRing.configureHttp().getOkHttpClientBuilder();
//获取Retrofit.Builder
DevRing.configureHttp().getRetrofitBuilder();
DevRing.configureImage()
//设置“加载中”状态时显示的图片
.setLoadingResId(R.mipmap.ic_image_load)
//设置“加载失败”状态时显示的图片
.setErrorResId(R.mipmap.ic_image_load)
//设置是否开启状态切换时的过渡动画,默认false
.setIsShowTransition(true)
//设置是否使用okhttp3作为网络组件,默认true
.setIsUseOkhttp(false)
//设置内存缓存大小,不建议设置,使用框架默认设置的大小即可
.setMemoryCacheSize(size)
//设置Bitmap池大小,设置内存缓存大小的话一般这个要一起设置,不建议设置,使用框架默认设置的大小即可
.setBitmapPoolSize(size)
//设置具体的磁盘缓存地址,传入的file需为文件夹
.setDiskCacheFile(file)
//设置磁盘缓存大小,单位byte,默认250M
.setDiskCacheSize(200*1024*1024)
//设置磁盘缓存地址是否在外部存储中,默认false
.setIsDiskCacheExternal(true);
如果你需要替换默认实现的图片框架(Glide),那么
1. 创建图片管理者类,要求实现IImageManager接口
2. 通过DevRing.configureImage(IImageManager)方法传入图片管理者类
3. 传入后和上面一样可以进行相关配置。
DevRing.configureImage(new FrescoManager())
.setXXX()
...
.setXXXX();
具体可查看Demo,演示了如何使用Fresco替换Glide
替换为Fresco后,相关的ImageView需换成SimpleDraweeView。
DevRing.configureBus()//配置默认的EventBus
//设置用于加速的Index
.setIndex(new MyEventBusIndex())
//设置是否使用index进行加速
.setIsUseIndex(true);
如果你需要替换默认实现的事件总线框架(EventBus),那么
1. 创建事件总线管理者类,要求实现IBusManager接口
2. 通过DevRing.configureBus(IBusManager)方法传入事件总线管理者类
DevRing.configureBus(new RxBusManager());
具体可查看Demo,演示了如何使用RxBus替换EventBus
由于GreenDao的特殊性以及具体数据表的不确定,无法很好地集成到DevRing当中。
所以需要进行如下操作:
1. 创建数据库管理者类,要求实现IDBManager接口
2. 通过DevRing.configureDB(IDBManager)方法传入数据库管理者。
(DevRing中已提供了GreenDao的一些辅助类,所以创建起来不会复杂,具体过程请参考Demo)
DevRing.configureDB(new GreenDBManager());
使用其他数据库也同样是通过DevRing.configureDB(IDBManager)方法传入数据库管理者。
Demo中演示了如何使用原生的数据库替换GreenDao
DevRing.configureDB(new NativeDBManager());
DevRing.configureCache()
//设置磁盘缓存最大缓存大小,单位为byte,默认无上限
.setDiskCacheMaxSize(50*1024*1024)
//设置磁盘缓存的文件夹数量上限,默认无上限
.setDiskCacheMaxCount(10)
//配置磁盘缓存的地址,传入的File需为文件夹,默认保存在/data/user/0/com.xxx.xxx/cache下
.setDiskCacheFolder(file);
DevRing.configureOther()
//设置是否开启崩溃日志功能,默认不开启
.setIsUseCrashDiary(true)
//设置崩溃日志的地址,传入的file需为文件夹,默认保存在/storage/emulated/0/Android/data/com.xxx.xxx/cache/crash_log下
.setCrashDiaryFolder(file)
//设置是否显示Ringlog打印的内容,默认true
.setIsShowRingLog(true);
DevRing.create();
几大模块都是通过DevRing.xxxManager()得到管理者,然后进行具体操作。
DevRing.httpManager().getService(XXXApiService.class);
DevRing.httpManager().commonRequest(observable, new CommonObserver>>() {
@Override
public void onResult(HttpResult> result) {
}
@Override
public void onError(int errType, String errMessage) {
}
}, RxLifecycleUtil.bindUntilEvent(lifeEmitter, FragmentEvent.DESTROY));
调用commonRequest()方法发起普通请求
- 参数1为普通的网络请求Observable。
- 参数2为请求回调Observer。
- 库中提供了CommonObserver,对异常信息进行了包装。
- 参数3为控制生命周期的LifecycleTransformer。
- 可通过RxLifecycleUtil来获取与页面生命周期绑定的LifecycleTransformer。
- 例如传入RxLifecycleUtil.bindUntilEvent(lifeEmitter, FragmentEvent.DESTROY)),则表示该请求会在Fragment Destroy时销毁。
- 传入null 则表示不对该请求进行生命周期控制
DevRing.httpManager().uploadRequest(observable, new UploadObserver(UrlConstants.UPLOAD) {
@Override
public void onResult(Object result) {
}
@Override
public void onError(long progressInfoId, String errMessage) {
}
@Override
public void onProgress(ProgressInfo progressInfo) {
}
}, RxLifecycleUtil.bindUntilDestroy(lifeEmitter));
调用uploadRequest()方法发起上传请求
- 参数1为上传的网络请求Observable。
- 参数2为上传的请求回调UploadObserver,可用于监听上传进度。
- 如果不需要监听上传进度,则使用空的构造函数
- 如果是普通地监听某个上传的进度,则使用一个参数的构造函数,并传入上传的URL地址
- 如果是使用同一个URL但根据请求参数的不同而上传不同资源的情况,则使用两个参数的构造函数,第一个参数传入上传的URL地址,第二参数传入自定义的字符串加以区分。
- onProgress(ProgressInfo progressInfo) 中获取进度信息
- onError(long progressInfoId, String errMessage) 中的progressInfoId为0,则为请求相关的异常,如果不为0,则为上传读写过程的异常
- 参数3为控制生命周期的LifecycleTransformer。 3.1.2中已作了说明
DevRing.httpManager().downloadRequest(file, observable, new DownloadObserver(UrlConstants.DOWNLOAD) {
@Override
public void onResult(boolean isSaveSuccess, String filePath) {
}
@Override
public void onError(long progressInfoId, String errMessage) {
}
@Override
public void onProgress(ProgressInfo progressInfo) {
}
}, RxLifecycleUtil.bindUntilDestroy(lifeEmitter));
调用downloadRequest()方法发起下载请求
- 参数1为目标保存文件,下载的内容将保存于此。
- 参数2为下载的网络请求Observable。
- 参数3为下载的请求回调DownloadObserver,可用于监听下载进度。
- 如果不需要监听下载进度,则使用空的构造函数
- 如果是普通地监听某个下载的进度,则使用一个参数的构造函数,并传入下载的URL地址
- 如果是使用同一个URL但根据请求参数的不同而下载不同资源的情况,则使用两个参数的构造函数,第一个参数传入下载的URL地址,第二参数传入自定义的字符串加以区分。
- onResult(boolean isSaveSuccess, String filePath) 中的isSaveSuccess表示是否成功保存到目标文件中,filePath为目标文件的绝对路径。
- onProgress(ProgressInfo progressInfo) 中获取进度信息
- onError(long progressInfoId, String errMessage) 中的progressInfoId为0,则为请求相关的异常,如果不为0,则为下载读写过程的异常
- 参数4为控制生命周期的LifecycleTransformer。 3.1.2中已作了说明
DevRing.imageManager().loadNet(url, imageView); //加载网络图片到控件
DevRing.imageManager().loadRes(resId, imageView);//加载res资源图片到控件
DevRing.imageManager().loadAsset(assetName, imageView);//加载asset资源图片到控件
DevRing.imageManager().loadFile(file, imageView);//加载本地图片文件到控件
相比3.2.1,多了一个LoadOption参数,用于设置加载选项。
//加载图片,并应用圆角、模糊、灰白效果。
DevRing.imageManager().loadNet/loadRes/loadAsset/loadFile(url, imageView,
new LoadOption().setRoundRadius(80).setIsGray(true).setBlurRadius(5));
LoadOption目前支持设置
- 加载中状态显示的图片
- 加载失败状态显示的图片
- 是否开启状态切换时的过渡动画
- 是否加载为圆形图片
- 加载为圆角图片的圆角值
- 加载为模糊图片的模糊值
- 是否加载为灰白图片
DevRing.imageManager().preLoad(url);
DevRing.imageManager().getBitmap(context, url, new ImageListener(){
@Override
public void onSuccess(Bitmap result) {
//获取成功,回调在主线程
}
@Override
public void onFail(Throwable throwable) {
//获取失败,回调在主线程
}
});
DevRing.imageManager().downLoadImage(context, url, file, new ImageListener(){
@Override
public void onSuccess(File result) {
//下载成功,回调在后台线程
}
@Override
public void onFail(Throwable throwable) {
//下载失败,回调在后台线程
}
});
DevRing.imageManager().clearMemoryCache();
DevRing.imageManager().clearDiskCache();
如果图片管理者中定义了IImageManager接口以外的方法,可以通过传入具体类型来调用。
DevRing.imageManager().xxx();
DevRing.busManager().register(subscriber);
DevRing.busManager().unregister(subscriber);
DevRing.busManager().postEvent(event);
DevRing.busManager().postStickyEvent(event);
如果事件总线管理者中定义了IBusManager接口以外的方法,可以通过传入具体类型来调用。
DevRing.busManager().cancelDelivery(event);
需先在DBManager的putTableManager()方法中,将数据表管理者通过(kye,value)方式放进Map中。
对key值对应的数据表,进行增删改查等。
DevRing.tableManager(key).insertOne(object); //插入一个数据
DevRing.tableManager(key).insertSome(list); //插入多个数据
DevRing.tableManager(key).insertOrReplaceOne(object); //插入一个数据,如果已存在则进行替换,根据主键来判断是否已存在
DevRing.tableManager(key).insertOrReplaceSome(list); //插入多个数据,如果已存在则进行替换,根据主键来判断是否已存在
DevRing.tableManager(key).deleteOne(object); //删除一个数据
DevRing.tableManager(key).deleteSome(list); //删除多个数据
DevRing.tableManager(key).deleteOneByKey(primarykey); //根据主键删除一个数据
DevRing.tableManager(key).deleteSomeByKeys(listPrimarykey); //根据主键删除多个数据
DevRing.tableManager(key).deleteAll(); //删除表中所有数据
DevRing.tableManager(key).updateOne(object); //更新一个数据
DevRing.tableManager(key).updateSome(list); //更新多个数据
DevRing.tableManager(key).loadOne(primarykey); //根据主键获取一个数据
DevRing.tableManager(key).loadAll(); //获取全部数据
DevRing.tableManager(key).count(); //获取表数据的数量
DevRing.tableManager(key).rawQuery(sql, selectionArgs); //条件查询
DevRing.tableManager(key).execSQL(sql); //执行SQL语句
如果表管理者中定义了ITableManager接口以外的方法,可以通过传入具体类型来调用。
DevRing.tableManager().queryBuilder().list();
DevRing.cacheManager().memoryCache().put(key, object); //存入数据
DevRing.cacheManager().memoryCache().get(key); //取出数据
DevRing.cacheManager().memoryCache().remove(key); //移除数据
DevRing.cacheManager().memoryCache().contains(key); //是否包key值对应的数据
DevRing.cacheManager().memoryCache().clear(); //清空所有数据
DevRing.cacheManager().diskCache(name).put(key, object); //存入数据
DevRing.cacheManager().diskCache(name).put(key, object, saveTime); //存入数据,并指定缓存时长
DevRing.cacheManager().diskCache(name).getXXX(key); //取出数据
DevRing.cacheManager().diskCache(name).remove(key); //移除数据
DevRing.cacheManager().diskCache(name).getCacheCount(); //获取已缓存的数量
DevRing.cacheManager().diskCache(name).getCacheSize(); //获取已缓存的空间大小
DevRing.cacheManager().diskCache(name).clear(); //清空所有数据
DevRing.cacheManager().spCache(name).put(key, object); //存入数据
DevRing.cacheManager().spCache(name).getXXX(key); //取出数据
DevRing.cacheManager().spCache(name).getAll(); //取出全部数据
DevRing.cacheManager().spCache(name).remove(key); //移除数据
DevRing.cacheManager().spCache(name).clear(); //清空所有数据
DevRing.permissionManager().requestEachCombined(activity, new PermissionListener() {
@Override
public void onGranted(String permissionName) {
//如果全部权限都被授予
}
@Override
public void onDenied(String permissionName) {
//如果用户拒绝了其中一个授权请求
}
@Override
public void onDeniedWithNeverAsk(String permissionName) {
//如果用户拒绝了其中一个授权请求,且勾选了不再提醒,则需要引导用户到权限管理页面开启
}
}, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA);
DevRing.activityStackManager().pushOneActivity(activity); //存进一个activity
DevRing.activityStackManager().popOneActivity(activity); //弹出栈顶的activity
DevRing.activityStackManager().currentActivity(); //获取栈顶的activity
DevRing.activityStackManager().firstActivity(); //获取栈底(第一个压住栈)的activity
DevRing.activityStackManager().getStackSize(); //获取应用activity的数量
DevRing.activityStackManager().exitActivity(activity); //退出activity
DevRing.activityStackManager().exitActivity(class); //退出类型为cls的Activity
DevRing.activityStackManager().exitActivityFirstIn(class); //退出类型为class且第一个进栈的Activity
DevRing.activityStackManager().exitActivityLastIn(class); //退出类型为class且最后一个进栈的Activity
DevRing.activityStackManager().exitAllActivityExceptThis(class); //退出除class类型以外的所有Activity
DevRing.activityStackManager().exitApplication() //退出应用(所有activity)
提供了ActivityLifeCallback 和 FragmentLifeCallback,以实现基类的功能。
只需Activity实现IBaseActivity接口即可完成相关的基类操作。
只需Fragment实现IBaseFragment接口即可完成相关的基类操作。
具体请查看关于基类的那些事 以及项目代码
可定位输出位置的Log
RingLog.e(TAG, message); //比如打印Error级日志
RingLog.json(TAG, jsonString);//将jsonString格式化后打印出来
RingLog.xml(TAG, xmlString);//将xmlString格式化后打印出来
...
吐司工具类
RingToast.show("hello world");
RingToast.show(R.string.appName);
状态栏/导航栏颜色工具类
用于沉浸式状态栏实现.
来自https://github.com/Zackratos/UltimateBar,具体用法到里面查阅。
文件工具类
FileUtil.isSDCardAvailable(); //SD卡是否能用
FileUtil.getDirectory(parentDirectory, directory); //获取文件夹
FileUtil.getFile(parentDirectory, name); //获取文件
FileUtil.getFile(filePath); //获取文件
FileUtil.deleteFile(file); //删除文件
FileUtil.calculateFileSize(file); //计算文件大小
FileUtil.copyFile(source, target); //复制文件
FileUtil.saveFile(inputStream, outputStream); //保存文件
….更多方法请查看代码
图片工具类.
用于对图片进行压缩(比例压缩 / 质量压缩)、跳转到相机/相册、对Bitmap做高斯模糊处理等。
ImageUtil.scaleCompress(res/filePath/bitmap, width, height); //按比例压缩,返回bitmap
ImageUtil.qualityCompress(bitmap, maxSize); //质量压缩,直至图片不大于maxSize
ImageUtil.saveBitmapToFile(bitmap, file); //保存图片到文件
….更多方法请查看代码
获取用于管理生命周期的Transformer
//获取与Fragment生命周期绑定的LifecycleTransformer
RxLifecycleUtil.bindUntilEvent(object, FragmentEvent.XXX);
//获取与Activity生命周期绑定的LifecycleTransformer
RxLifecycleUtil.bindUntilEvent(object, ActivityEvent.XXX);
//获取该Activity用于控制网络请求生命周期的PublishSubject,key为Activity的内存地址
RxLifecycleUtil.getActivityLifeSubject(key);
//获取该Fragment用于控制网络请求生命周期的PublishSubject,key为Fragment的内存地址
RxLifecycleUtil.getFragmentLifeSubject(key);
网络状态工具类
NetworkUtil.isNetWorkAvailable(context); //当前网络是否可用
NetworkUtil.getNetWorkType(context); //获取当前网络类型
NetworkUtil.isWifiConnected(context); //当前是否为WIFI连接
NetworkUtil.isMobileConnected(context); //当前是否为移动网络
NetworkUtil.getAPNType(context); //获取apn类型