高效App框架设计与重构

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

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

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值