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

https://github.com/LJYcoder/DevRing

介绍

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

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

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

如果觉得不错,不妨点个star。你的支持,是我开源的动力~

使用说明

1. 添加依赖

在项目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'


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)
        //设置具体的磁盘缓存地址,传入的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。

2.2.3 配置事件总线模块

DevRing.configureBus()//配置默认的EventBus
        //设置用于加速的Index
        .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中已提供了GreenDao的一些辅助类,所以创建起来不会复杂,具体过程请参考Demo)

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

3.1.2 普通请求

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 则表示不对该请求进行生命周期控制

3.1.3 上传请求,可监听进度

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中已作了说明

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, 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中已作了说明

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);//加载本地图片文件到控件
  • 将自动使用 2.2.2 配置的“加载中显示的图片”,“加载失败显示的图片”,“是否开启过渡效果” 来进行加载。

3.2.2 定制化加载图片

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

//加载图片,并应用圆角、模糊、灰白效果。
DevRing.imageManager().loadNet/loadRes/loadAsset/loadFile(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(){
    @Override
    public void onSuccess(Bitmap result) {
          //获取成功,回调在主线程
    }

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

3.2.5 下载图片到指定文件

DevRing.imageManager().downLoadImage(context, url, file, new ImageListener(){
    @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.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.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.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);
  • 还提供了一个requestEach()方法,参数都一样。
  • 如果要求申请的权限全都授予才能使用某功能的话,建议使用requestEachCombined()方法来申请。

3.7 Activity栈模块

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)


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.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.scaleCompress(res/filePath/bitmap, width, height); //按比例压缩,返回bitmap
ImageUtil.qualityCompress(bitmap, maxSize); //质量压缩,直至图片不大于maxSize
ImageUtil.saveBitmapToFile(bitmap, file); //保存图片到文件

….更多方法请查看代码

3.9.6 RxLifecycleUtil

获取用于管理生命周期的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);

3.9.7 NetworkUtil

网络状态工具类

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


注意事项

  1. DevRing库中AndroidManifest已添加了网络权限,所以主项目不必重复添加。
  2. DevRing库中已添加了Dagger2,Retrofit2,RxJava2,RxAndroid2,RxLifeCycle2,RxPermission2的依赖,所以主项目不必重复添加。
  3. 配置参数为File时,请自行确保对传入的file具有可读写权限,如果没有需先进行权限申请。

4. 部分框架需忽略混淆,具体的混淆配置请参考Demo中app下的proguard-rules.pro文件。

你可能感兴趣的:(开发框架)