你还在新建项目时一个一个配置吗?今天有福利了,一行代码集成,简单配置后,就可以按照自己想要的任何开发框架开发了,比如MVP、MVVM、MVC、你自创的开发模式也可以...哈哈哈
先说集成方法:
第一步:参考最新github地址
compile 'com.bintray.library:common_library:1.0.1'
第二步:application中初始化,还有别忘了AndroidManifest中的配置,参考一中的4.2:
//今日头条适配配置
AutoSizeConfig.getInstance().getUnitsManager()
.setSupportDP(false)
.setSupportSP(false)
.setSupportSubunits(Subunits.NONE);
if (AppConstant.is_debug) {
//开启InstantRun之后,一定要在ARouter.init之前调用openDebug
ARouter.openDebug();
ARouter.openLog();
}
//初始化ARouter
ARouter.init(this);
//common依赖库的相关初始化
CommonLibConstant.init()
.setAppContext(this)
.setIsDebug(AppConstant.is_debug)
.setNoNetWorkRemind("无网络")
.setSharedPreferencesName("base_db")
.setCrashSavePath(AppConstant.LOCAL_PATH)
.setExternalNetworkIP();
//网络请求初始化
RetrofitClientUtil.initClient()
.useCookiesInterceptor(new AddCookiesInterceptor(APPApplication.this))
.setConnectionPoolNums(8)
.setConnectionPoolKeepTime(15)
.setRequestOutTime(20)
.setRequestBaseUrl(AppConstant.base_url)//必须设置
.build();//必须设置
第三步:如果你想使用butterknife找多个控件设置点击事件,可以参考下面代码配置,要是不需要就可以不添加下面代码(多模块可以将R改为R2使用)
1、//在项目的build.gradle中配置,由于依赖库也集成了butterknife,所以需要配置下,在需要用的页面自己进行注册
//此方法好像必须gradle版本4.4以上
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc3'
2、在应用模块的build.gradle中配置
apply plugin: 'com.jakewharton.butterknife'
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc3'
好了这里就搭建完了,可以愉快的去开发了,建议自定义基础类集成依赖库中的类,方便你的后续公共处理。重要!重要!重要!
-----------------------------------------------------------------------以下主要是介绍-----------------------------------------------------------
下来我们看看这个基础库都包含了哪些东西:
1、基础Activity、Fragment的搭建等
2、网络请求框架(在retrofit基础上再次封装)
3、常用工具类的封装
好了,看看如何
一、基础Activity、Fragment的搭建等都具体有哪些呢?
1、使用了DataBinding,我只是简单实用DataBinding替代了findViewById功能:
2、使用阿里的ARouter进行跳转,关于使用方法直接参考https://github.com/alibaba/ARouter
3、建议自定义一个AppBaseActivity基础类,方便你做一些基础功能的配置:类似
public abstract class AppBaseActivity<T extends ViewDataBinding> extends BaseActivity<T> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//若是不需要设置状态栏透明,此设置必须放置在super.onCreate之前处理
// isStatusBar = false;
super.onCreate(savedInstanceState);
}
}
4、项目使用的是今日头条的适配方案:https://github.com/JessYanCoding/AndroidAutoSize
4.1、在项目的Application初始化
//今日头条适配配置==不设置下面配置会出现在有些设配同比例放大,字体和宽都变得特别大
AutoSizeConfig.getInstance().getUnitsManager()
.setSupportDP(false)
.setSupportSP(false)
.setSupportSubunits(Subunits.NONE);
4.2、在AndroidManifest文件中的application标签中配置(两个值根据UI标注尺寸设置即可):
<meta-data
android:name="design_width_in_dp"
android:value="375" />
<meta-data
android:name="design_height_in_dp"
android:value="667" />
二、网络请求(以下包含很多伪代码,完整代码你可以参考文末的demo链接):
1、在项目的Application初始化:
//网络请求初始化
RetrofitClientUtil.initClient()
.useCookiesInterceptor(new AddCookiesInterceptor(APPApplication.this))
.setConnectionPoolNums(8)//连接池个数
.setConnectionPoolKeepTime(15)//连接池保活时间,单位秒
.setRequestOutTime(20)//设置超时时间 单位秒
.setRequestBaseUrl(AppConstant.base_url)//必须设置
.build();//必须设置
拦截器Interceptor可以参考AddCookiesInterceptor写一个属于自己项目的,因为请求头等没法写,所以这里建议仿照写自定义一个,让你仿照是因为这个拦截器做了请求处理,可以直接将请求链接、请求参数、请求结果清晰的打印出来,方便调试;
返回结果自定义处理类可以仿照ExampleRequestApiHelper示例类实现返回结果的处理:
/**
* author : zyt
* e-mail : 632105276@qq.com
* date : 2019/2/21
* desc :示例统一处理数据格式的类
*/
public abstract class ExampleRequestApiHelper extends RequestApiCallBack<JsonObject> {
//这里可以更改为自己项目需要的加载提示Dialog
private LoadingDialog loadingDialog;
public ExampleRequestApiHelper() {
super();
}
public ExampleRequestApiHelper(Context mContext) {
super(mContext);
initLoadingDialog();
}
@Override
public void onStart() {
super.onStart();
//显示加载loading
if (loadingDialog != null && !loadingDialog.isShowing()) {
loadingDialog.showLoading();
}
}
/**
* 处理返回数据
*
* @param isSuccess 只有true正常处理
* @param rootJson
*/
protected abstract void dealSuccessData(boolean isSuccess, JSONObject rootJson);
@Override
public void onSuccess(JsonObject rootData) {
//在这里设置取消dialog就可以
dissmissLoadDialog();
try {
JSONObject rootJson = new JSONObject(rootData.toString());
int code = rootJson.optInt("code", -1);
switch (code) {
case 0://成功
dealSuccessData(true, rootJson);
break;
case 10000://失败
dealSuccessData(false, rootJson);
ToastUtils.getInstance().showToast(rootJson.optString("msg"));
break;
case -1://未登录
if (mMContext != null) {
}
break;
case 10001://失败状态 不弹出Toast
dealSuccessData(false, rootJson);
break;
default:
dealSuccessData(false, rootJson);
ToastUtils.getInstance().showToast(rootJson.optString("msg"));
break;
}
} catch (JSONException e) {
ToastUtils.getInstance().showToast("解析出错");
e.printStackTrace();
}
}
@Override
public void onFail(Throwable e) {
//在这里设置取消dialog就可以
dissmissLoadDialog();
ToastUtils.getInstance().showToast(e.getMessage());
}
/**
* 初始化LoadingDialog
*/
private void initLoadingDialog() {
if (loadingDialog == null) {
loadingDialog = new LoadingDialog(mMContext);
}
}
/**
* 关闭加载dialog
*/
private void dissmissLoadDialog() {
if (loadingDialog != null && loadingDialog.isShowing()) {
loadingDialog.dismiss();
}
}
}
请求Presenter需要继承BasePresenter调用请求方法:
RequestParams requestParams = new RequestParams();
requestParams.addFormPart("type",4);
requestParams.addFormPart("status","1");
addSubscription(RetrofitClientUtil.initClient().create(MainModelApi.class).uploadUserTime(requestParams.create()),
new ExampleRequestApiHelper() {
@Override
protected void dealSuccessData(boolean isSuccess, JSONObject rootJson) {
mView.getDataSuccess(rootJson);
}
});
三、常用工具:
| 类名 | 功能 |
图片加载(glide库) | ImageUtil | 支持正常加载、圆形图加载、圆角图加载、圆角和直角混合加载等; |
页面缓存 | ACacheDb | 缓存数据的轻量级框架,用于缓存页面json数据,当没网络也可以显示数据 |
手机app缓存 | CacheDataManager | 获取手机app缓存 |
防止快速点击操作 | FastClickUtils | 防止快速点击操作,造成的多次触发 |
Toast工具类 | ToastUtils | Toast提示,全局中间或者底部显示,多次吐司只替换内容 |
选择时间 | WheelsUtils | 时间滚轮选择器,支持选择当前时间以后或者以前的日期 |
日期工具类 | DateUtils | 跟日期相关的转化和获取等功能 |
图片压缩 | ImageCompressUtil | 使用和luban一样,我这里是拿取了luban的核心代码 |
状态栏相关 | StatusNavBar | 可以设置状态栏颜色、字体等修改 |
RecyclerView间距设置 | RecyclerLinearDecoration针对LinearLayoutManager的间距,RecyclerGridDecoration针对GridLayoutManager的间距 | |
项目常用方法 | AppUtils | app的版本名、版本号、关闭键盘、显示键盘 |
Bitmap相关 | BitMapUtils | 更改bitmap的宽高、通过View获取Bitmap对象、两个图片的拼接、bitmap的各种转换、保存到相册并刷新等 |
权限相关 | PermissionsUtils | 验证必要权限、跳转应用信息页面、检测通知是否打开、在应用商店找到应用等 |
系统相关 | SystemUtil | 获取手机唯一标示(phone权限)、屏幕/当前页面亮度、设备IP、手机品牌、型号、系统版本等 |
SharedPreferences再封装 | AppSharedPreHelper | SharedPreferences数据存储获取数据的封装 |
网络工具 | NetworkUtil | 是否有网络、网络状态、获取外网IP等 |
崩溃日志收集 | CrashHandler | 崩溃日志会保存在手机中,debug模式崩溃会直接以Activity显示崩溃的详细情况 |
需要注意点:
1、设置状态栏、导航栏:
StatusNavBar.with(this).statusBarColor(R.color.transparent)
.statusBarDarkFont(true).navigationBarColor(R.color.black_degree_50).init();
2、图片压缩直接参考:https://github.com/Curzibn/Luban 的使用方法
3、数据解析使用的是Gson封装
//解析数组数据方法:
List<DataBean> dataList = GsonUtils.init().fromJsonArray("json数据", DataBean.class);
//解析数据对象方法:
DataBean dataBean = GsonUtils.init().fromJsonObject("json数据", DataBean.class);
写之前感觉有很多东西要写,当开始写了发现很多东西都写不出来,需要看着项目去熟悉,文章只是为了帮助你理解的,最好还是去下载demo参考下,感觉好希望可以给一个star,谢谢了?;
参考项目:图片压缩 https://github.com/Curzibn/Luban
头条适配 https://github.com/JessYanCoding/AndroidAutoSize