1. 规划Android项目结构
平时我们自己开发一个Android项目时,我们更多是在一个工程里新建一个Android项目,然后在项目中划分不同的板块,例如activities、adapter、entity、net等等,一个项目就将工程的所有功能都实现了,那是因为我们的页面比较少,但是在公司里,公司的项目都是很大的,如果有200个页面的工程,就有200个Activity,再加上逻辑处理、实体、自定义控件、数据请求等等,整个工程下来,如果一个项目就将工程中所有功能都实现了,你会发现整个项目非常大以及后期代码不易于管理和修改
项目结构:
首先,我们新建了一个Android工程之后,默认有个主项目,然后我们在工程中新建个module,命名为AndroidLib,我们让AndroidLib成为这个工程中最基础的类库,主工程项目保持对AndroidLib库的依赖,具体如何依赖,其中有讲解,顺便学习一下gradle配置,AndroidLib中主要编写一些与工程业务无关的逻辑代码!
那什么是与业务无关?
例如:目前公司有个工程是开发一款学车App,学车App其中的业务要分报名驾校、预约学车、笔试刷题、车友圈交流等等不同的业务,但是所有的业务中Activity几乎都有四个必须要处理的环节,第一初始化控件;第二获取上个页面传递过来信息,做一些逻辑处理;第三根据当前页面已有的信息发送数据请求等操作,然后根据获取到的信息初始化界面;第四页面关闭,销毁一些数据,防止出现内存泄漏(常见Android内存泄漏汇总),而这四个环节不会因为业务的不存在而不存在,所以这就需要将这些共同的属性提取到AndroidLib中去编写一个基类,可以名为:BaseActivity
我们在主项目中,再写一个基础的封装类Activity,可以名为AppBaseActivity,让它继承AndroidLib中的BaseActivity,AppBaseActivity主要提取业务的公共逻辑!
与业务无关的代码我们肯定也要分板块,至少有五个基础部分
- activity 页面的与业务无关的逻辑
- net 网络底层封装
- cache 缓存数据和图片的相关处理
- ui 自定义控件
- utils 存放业务无关的公用方法
主项目中的分层如下:
- activity 在其中可以按照业务模块继续划分到不同的包下
- adapter 其中也可以根据不同的业务模块划分,但是通常adapter大部分逻辑都是一样的,也可以不划分,当这个包有10个以上的adapter类建议可以根据业务模块划分
- entity 所有的实体类
- db SQLLite相关逻辑的封装
- engine 与业务相关的类
- ui 自定义的控件
- utils 所有公用的方法
- interfaces 接口
- listener Listener的接口
这样划分的目的:
1. 每个文件都有一个单独的类,不使用嵌套类
2. Activity按照模块拆分,可以迅速定位具体的一个页面
2.BaseActivity的写法
public abstract class BaseActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化界面控件
initViews(savedInstanceState);
//处理上个页面传递过来的数据
initVariables();
//根据已有的信息执行数据请求或者从本地缓存中获取数据,初始化界面上的控件,显示得到的信息
loadData();
}
protected abstract void loadData();
protected abstract void initVariables();
protected abstract void initViews(Bundle savedInstanceState);
@Override
protected void onDestroy() {
super.onDestroy();
//关闭有些需要释放的资源
close();
}
protected abstract void close();
}
3.类型安全转换函数
为什么要写这个函数?
打个比方,公司里面的前端写了个配置网站,你们的App会从后台去获取这些配置信息,然后在App端具体显示这些信息,但是App端与web前后台交流不到位,前端配置网站不可能每个配置输入框都要输入信息,但是后台又没有通过写入一些默认信息写入数据库,所以这时出现一个问题,如果有个整型数据的配置信息,但是客户并没有具体配置,App端认为获取的数据是整型数据,但是用户没有配置,该信息在数据库中是空,App端直接获取到后台的数据后就准备显示到界面上,你准备将其转换成int型数据,你发现你的App直接崩溃,出现类型转换出错异常…………
这就证明了类型安全转换函数的必要性!
整型安全转换函数(其他的类型如果有必要的话,也可以写个类型安全转换函数):
public final static int convertToInt(Object value, int defaultValue) {
//当数据为空时,返回默认值
if (value == null || "".equals(value.toString().trim())) {
return defaultValue;
}
try {
//返回转换的数据,如果出现异常,说明其不是整型数据
return Integer.valueOf(value.toString());
} catch (Exception e) {
try {
return Double.valueOf(value.toString()).intValue();
} catch (Exception e1) {
return defaultValue;
}
}
}
还有什么不足的地方,望请通过评论的方式指出,谢谢,虚心学习,共同进步!