高效App框架设计与重构

来源:互联网 发布:ubuntu 字体 编辑:程序博客网 时间:2024/06/05 01:14

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主要提取业务的公共逻辑!

与业务无关的代码我们肯定也要分板块,至少有五个基础部分

  1. activity 页面的与业务无关的逻辑
  2. net 网络底层封装
  3. cache 缓存数据和图片的相关处理
  4. ui 自定义控件
  5. utils 存放业务无关的公用方法

主项目中的分层如下:

  1. activity 在其中可以按照业务模块继续划分到不同的包下
  2. adapter 其中也可以根据不同的业务模块划分,但是通常adapter大部分逻辑都是一样的,也可以不划分,当这个包有10个以上的adapter类建议可以根据业务模块划分
  3. entity 所有的实体类
  4. db SQLLite相关逻辑的封装
  5. engine 与业务相关的类
  6. ui 自定义的控件
  7. utils 所有公用的方法
  8. interfaces 接口
  9. 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;        }    }}

还有什么不足的地方,望请通过评论的方式指出,谢谢,虚心学习,共同进步!

原创粉丝点击