android架构之路程序员

安卓基础开发库,DevRing使用说明

2018-03-30  本文已影响2052人  JYcoder

https://github.com/LJYcoder/DevRing

介绍

经过一番努力,对几个常用框架进行了封装,并抽成一个安卓基础开发库
主要包括 网络请求、图片加载、数据库、事件总线、缓存、权限管理、工具类 模块。

其中,网络请求使用Retrofit+RxJava实现,图片加载使用Glide实现(可替换),数据库使用GreenDao实现(可替换),事件总线使用EventBus实现(可替换),权限管理使用RxPermission实现。

Demo采用MVP+Dagger2进行开发,演示了各模块的使用。
对以上提及的框架如果不熟悉,建议先行了解下~

如果觉得对你有帮助,不妨点个★star支持鼓励我~

使用说明

1. 添加依赖

在项目module下的gradle中添加以下依赖:

compile 'com.ljy.ring:devring:x.x.x'  //版本号请到github确认

2. 初始化、配置、构建

在Application的onCreate中进行初始化、配置、构建。
务必按顺序执行这三步。

2.1 初始化

DevRing.init(this);

2.2 配置

根据你的需求进行相关模块的全局配置,下面将对每个配置方法进行说明。

2.2.1 配置网络请求模块

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();

2.2.2 配置图片加载模块

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)
        //设置磁盘缓存地址是否在外部存储中,默认false
        .setIsDiskCacheExternal(true)
        //设置具体的磁盘缓存地址,传入的file需为文件夹
        .setDiskCacheFile(file)
        //设置磁盘缓存大小,单位byte,默认250M
        .setDiskCacheSize(200*1024*1024);

如果你需要替换默认实现的图片框架(Glide),那么

  1. 创建图片管理者类,要求实现IImageManager接口
  2. 通过DevRing.configureImage(IImageManager)方法传入图片管理者类
  3. 传入后和上面一样可以进行相关配置。
DevRing.configureImage(new FrescoManager())
        .setXXX()
        ...
        .setXXXX();

具体可查看Demo,演示了如何使用Fresco替换Glide
替换为Fresco后,相关的ImageView需换成SimpleDraweeView。

2.2.3 配置事件总线模块

DevRing.configureBus()//配置默认的EventBus
        //设置用于加速的Index,具体生成方法请参考我的那篇EventBus介绍
        .setIndex(new MyEventBusIndex())
        //设置是否使用index进行加速
        .setIsUseIndex(true);

如果你需要替换默认实现的事件总线框架(EventBus),那么

  1. 创建事件总线管理者类,要求实现IBusManager接口
  2. 通过DevRing.configureBus(IBusManager)方法传入事件总线管理者类
DevRing.configureBus(new RxBusManager());

具体可查看Demo,演示了如何使用RxBus替换EventBus

2.2.4 配置数据库模块

由于GreenDao的特殊性以及具体数据表的不确定,无法很好地集成到DevRing当中。
所以需要进行如下操作:

  1. 创建数据库管理者类,要求实现IDBManager接口
  2. 通过DevRing.configureDB(IDBManager)方法传入数据库管理者。
DevRing.configureDB(new GreenDBManager());

使用其他数据库的话,也同样是通过DevRing.configureDB(IDBManager)方法传入数据库管理者。
Demo中演示了如何使用原生的数据库替换GreenDao

DevRing.configureDB(new NativeDBManager());

2.2.5 配置缓存模块

DevRing.configureCache()
        //设置磁盘缓存最大缓存大小,单位为byte,默认无上限
        .setDiskCacheMaxSize(50*1024*1024)
        //设置磁盘缓存的文件夹数量上限,默认无上限
        .setDiskCacheMaxCount(10)
        //配置磁盘缓存的地址,传入的File需为文件夹,默认保存在/data/user/0/com.xxx.xxx/cache下
        .setDiskCacheFolder(file);

2.2.6 配置其他模块

DevRing.configureOther()
        //设置是否开启崩溃日志功能,默认不开启
        .setIsUseCrashDiary(true)
        //设置崩溃日志的输出地址,传入的file需为文件夹,默认保存在/storage/emulated/0/Android/data/com.xxx.xxx/cache/crash_log下
        .setCrashDiaryFolder(file)
        //设置是否显示Ringlog打印的内容,默认true
        .setIsShowRingLog(true);

2.3 构建

DevRing.create();

3. 开始调用

几大模块都是通过DevRing.xxxManager()得到管理者,然后进行具体操作。

3.1 网络请求模块

3.1.1 获取Retrofit的请求API接口

DevRing.httpManager().getService(XXXApiService.class);

比如:获取登录的请求Observable

Observable observable = DevRing.httpManager().getService(UserApiService.class).login();

3.1.2 普通请求

DevRing.httpManager().commonRequest(observable, new CommonObserver<HttpResult<List<MovieRes>>>() {
    @Override
    public void onResult(HttpResult<List<MovieRes>> result) {
    }

    @Override
    public void onError(HttpThrowable throwable){
    }
}, RxLifecycleUtil.bindUntilEvent(lifeEmitter, FragmentEvent.DESTROY));

调用commonRequest()方法发起普通请求

3.1.3 上传请求,可监听进度

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) {
     }
}, RxLifecycleUtil.bindUntilDestroy(lifeEmitter));

调用uploadRequest()方法发起上传请求

3.1.4 下载请求,可监听进度

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) {
    }
}, RxLifecycleUtil.bindUntilDestroy(lifeEmitter));

调用downloadRequest()方法发起下载请求

下载方面并没提供"多线程下载"、"断点续传"的功能。
如果需要的话,这里推荐github上的下载框架FileDownloader1FileDownloader2

3.1.5 刷新管理者

如果你在2.2配置初始化后,需要对Http的全局配置进行修改,
请在修改配置后调用DevRing.httpManager().refreshInstance(); 进行刷新,
它将根据你最新的Http配置进行重新构建。

3.2 图片请求模块

3.2.1 普通加载图片

DevRing.imageManager().loadNet(url, imageView); //加载网络图片到控件
DevRing.imageManager().loadRes(resId, imageView);//加载res资源图片到控件
DevRing.imageManager().loadAsset(assetName, imageView);//加载asset资源图片到控件
DevRing.imageManager().loadFile(file, imageView);//加载本地图片文件到控件

3.2.2 定制化加载图片

相比3.2.1,多了一个LoadOption参数,用于设置加载选项。

//加载图片,并应用圆角、模糊、灰白效果。
DevRing.imageManager().loadXXX(url, imageView, new LoadOption().setRoundRadius(80).setIsGray(true).setBlurRadius(5));

LoadOption目前支持设置

3.2.3 预加载图片

DevRing.imageManager().preLoad(url);

3.2.4 获取网络图片的Bitmap

DevRing.imageManager().getBitmap(context, url, new ImageListener<Bitmap>(){
    @Override
    public void onSuccess(Bitmap result) {
          //获取成功,回调在主线程
    }

    @Override
    public void onFail(Throwable throwable) {
          //获取失败,回调在主线程
    }
});

3.2.5 下载图片到指定文件

DevRing.imageManager().downLoadImage(context, url, file, new ImageListener<File>(){
    @Override
    public void onSuccess(File result) {
          //下载成功,回调在后台线程
    }

    @Override
    public void onFail(Throwable throwable) {
          //下载失败,回调在后台线程
    }
});

3.2.6 清空内存缓存

DevRing.imageManager().clearMemoryCache();

3.2.7 清空磁盘缓存

DevRing.imageManager().clearDiskCache();

3.2.8 调用接口以外的方法

如果图片管理者中定义了IImageManager接口以外的方法,可以通过传入具体类型来调用,如下:

DevRing.<GlideManager>imageManager().xxx();

3.3 事件总线模块

3.3.1 订阅

DevRing.busManager().register(subscriber);

3.3.2 解除订阅

DevRing.busManager().unregister(subscriber);

3.3.3 发送普通事件

DevRing.busManager().postEvent(event);

3.3.4 发送粘性事件

DevRing.busManager().postStickyEvent(event);

3.3.5 调用接口以外的方法

如果事件总线管理者中定义了IBusManager接口以外的方法,可以通过传入具体类型来调用,如下。

DevRing.<EventBusManager>busManager().cancelDelivery(event);

3.4 数据库模块

需先在DBManager的putTableManager()方法中,将数据表管理者通过(kye,value)方式放进Map中。

对key值对应的数据表,进行增删改查等。

3.4.1 增

DevRing.tableManager(key).insertOne(object); //插入一个数据
DevRing.tableManager(key).insertSome(list); //插入多个数据 
DevRing.tableManager(key).insertOrReplaceOne(object); //插入一个数据,如果已存在则进行替换,根据主键来判断是否已存在
DevRing.tableManager(key).insertOrReplaceSome(list); //插入多个数据,如果已存在则进行替换,根据主键来判断是否已存在

3.4.2 删

DevRing.tableManager(key).deleteOne(object); //删除一个数据
DevRing.tableManager(key).deleteSome(list); //删除多个数据
DevRing.tableManager(key).deleteOneByKey(primarykey); //根据主键删除一个数据
DevRing.tableManager(key).deleteSomeByKeys(listPrimarykey); //根据主键删除多个数据
DevRing.tableManager(key).deleteAll(); //删除表中所有数据

3.4.3 改

DevRing.tableManager(key).updateOne(object); //更新一个数据
DevRing.tableManager(key).updateSome(list); //更新多个数据

3.4.4 查

DevRing.tableManager(key).loadOne(primarykey); //根据主键获取一个数据
DevRing.tableManager(key).loadAll(); //获取全部数据
DevRing.tableManager(key).count(); //获取表数据的数量
DevRing.tableManager(key).rawQuery(sql, selectionArgs); //条件查询

3.4.5 执行SQL语句

DevRing.tableManager(key).execSQL(sql); //执行SQL语句

3.4.6 调用接口以外的方法

如果表管理者中定义了ITableManager接口以外的方法,可以通过传入具体类型来调用,如下。

DevRing.<GreenTableManager>tableManager().queryBuilder().list();

3.5 缓存模块

3.5.1 内存缓存

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(); //清空所有数据

3.5.2 磁盘缓存,可指定缓存时长

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(); //清空所有数据

3.5.3 SharedPreference

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(); //清空所有数据

3.6 权限管理模块

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);

3.7 Activity管理模块

改自JessYan的AppManager

DevRing.activityListManager().addActivity(activity); //存进一个activity
DevRing.activityListManager().removeActivity(activity); //移除一个activity
DevRing.activityListManager().getCurrentActivity(); //获取在前台的activity
DevRing.activityListManager().getTopActivity(); //获取最近启动的的activity
DevRing.activityListManager().getActivityList(); //获取存放activity的list
DevRing.activityListManager().killActivity(class); //关闭指定class的所有activity
DevRing.activityListManager().activityInstanceIsLive(activity); //指定的activity实例是否存活
DevRing.activityListManager().activityClassIsLive(class); //指定class的activity是否存活(同一个 class可能有多个activity实例)
DevRing.activityListManager().findActivity(class); //获取指定class的activity,没有则返回 null (同一个class有多个实例,则返回最早创建的实例)
DevRing.activityListManager().killAll(); //关闭所有activity
DevRing.activityListManager().killAllExclude(class); //关闭除了指定class的activity以外的所有activity
DevRing.activityListManager().exitApp(); //关闭所有页面并退出应用

3.8 LifeCycleCallback

提供了ActivityLifeCallback 和 FragmentLifeCallback,以实现基类的功能。
只需Activity实现IBaseActivity接口即可完成相关的基类操作。
只需Fragment实现IBaseFragment接口即可完成相关的基类操作。
具体请查看关于基类的那些事 以及项目代码

3.9 工具类

3.9.1 RingLog

可定位输出位置的Log

RingLog.e(TAG, message); //比如打印Error级日志
RingLog.json(TAG, jsonString);//将jsonString格式化后打印出来
RingLog.xml(TAG, xmlString);//将xmlString格式化后打印出来
...

3.9.2 RingToast

吐司工具类

RingToast.show("hello world");
RingToast.show(R.string.appName);

3.9.3 ColorBar

状态栏/导航栏颜色工具类
用于沉浸式状态栏实现.
来自https://github.com/Zackratos/UltimateBar并做了一点修改,具体用法到里面查阅。

3.9.4 FileUtil

文件工具类

FileUtil.getUriForFile(context, file); //根据file获取uri,适配7.0系统
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); //保存文件

....更多方法请查看代码

3.9.5 ImageUitl

图片工具类.
用于对图片进行压缩(比例压缩 / 质量压缩)、跳转到相机/相册、对Bitmap做高斯模糊处理等。

ImageUtil.getImageFromCamera(activity, uri); //使用相机拍照并保存到指定位置
ImageUtil.getImageFromAlbums(activity); //从手机相册中获取照片
ImageUtil.cropImage(activity, cropWidth, cropHeight, photoUri, fileToSave); //使用系统的裁剪图片,并保存至指定位置
ImageUtil.scaleCompress(res/filePath/bitmap, width, height); //按比例压缩,返回bitmap
ImageUtil.qualityCompress(bitmap, maxSize); //质量压缩,直至图片不大于maxSize
ImageUtil.saveBitmapToFile(bitmap, file); //保存图片到文件

....更多方法请查看代码

3.9.6 NetworkUtil

网络状态工具类

NetworkUtil.isNetWorkAvailable(context); //当前网络是否可用
NetworkUtil.getNetWorkType(context); //获取当前网络类型
NetworkUtil.isWifiConnected(context); //当前是否为WIFI连接
NetworkUtil.isMobileConnected(context); //当前是否为移动网络
NetworkUtil.getAPNType(context); //获取apn类型

注意事项

  1. 配置参数为File时,请自行确保对传入的File具有可读写权限。
  2. 部分框架需忽略混淆,具体的混淆配置请参考Demo中app下的proguard-rules.pro文件。
  3. DevRing库中AndroidManifest已添加了网络权限,所以主项目不必重复添加。
  4. DevRing库中已添加了Glide,EventBus,GreenDao,Dagger2,Retrofit2,RxJava2,RxAndroid2,RxLifeCycle2,RxPermission2的依赖,所以主项目不必重复添加。
  5. 可以通过exclude移除DevRing库中相关框架的依赖以减小包体积。 例如:
api ('com.ljy.ring:devring:x.x.x'){
   //如果不需使用图片加载模块或者该模块不使用Glide实现,那么可以加上这句移除Devring库中对Glide的依赖以减小包体积
   exclude module: 'glide'
   //如果不需使用事件总线模块或者该模块不使用EventBus实现,那么可以加上这句移除Devring库中对EventBus的依赖以减小包体积
   exclude module: 'eventbus'
   //如果不需使用数据库模块或者该模块不使用GreenDao实现,那么可以加上这句移除Devring库中对GreenDao的依赖以减小包体积
   exclude module: 'greendao'
}



有什么问题或建议,欢迎提issue或者简信告知~


上一篇下一篇

猜你喜欢

热点阅读