干货!Android日常编码习惯总结,让你代码更完美

2020-05-28  本文已影响0人  南山村靓仔

1 方法代码别太长

遵循单一职责原则,一个方法实现的功能尽量单一,这样可增加可读性,也利于方法复用

2 类、重要方法一定要加注释

创建类的时候,增加类注释,这在协同开发中非常重要,能方便其他同事快速了解类主要功能

/**
 * @author:cj on 2019/8/26 0026 10:27
 * @dec:指令下发后,子线程操作处理 
 */

重要方法前加入方法描述、参数、返回值描述,具体

/*****************************************************************************
 功能描述  : 从一个csv文件中获取一行csv的记录
 输入参数  : pName       : 文件名(含路径)
             iLineNum    : 行号。从1开始计算,1表示第一行
 输出参数  : pbyLineData : 一行的数据,存放在该内存中
 返 回 值  : 成功: 一行的数据长度
             失败: 对应的错误代码
*****************************************************************************/

3 写出最优化的布局

1.选择性能消耗更低的ViewGroup,能用LinearLayout、FrameLayout,就别用RelativeLayout,因为RelativeLayout功能较复杂,布局过程会花费更多的CPU时间
2.布局需要重用时,使用<include>标签、<merge>标签,把布局抽取出来
3.按需加载的界面,使用ViewStub实现,当需要时才会将ViewStub中的布局加载到内存,能提高程序初始化效率

4 onDraw中不要做初始化操作

onDraw方法可能会被频繁调用,所以不要在此方法中创建对象,毕竟对象的频繁创建和销毁是很影响性能的

5 配对方法配对调用

因为配对方法他们的触发时机也相应是配对的。能保证注册、反注册等配对操作顺利执行,防止内存泄漏。比如onResume中注册监听,那么我们就在onPause中取消监听;
配对方法举例:
onCreate---onDestroy
onResume---onPause
onAttachedToWindow---onDetachedFromWindow

6 try catch要把错误详情打印出来

使用Log.getStackTraceString(e)能将错误详细堆栈打印出来,有利于排查问题

catch (Exception e) {
            MGLogger.d(TAG, "XXX catch exception:" + Log.getStackTraceString(e));
  }

7 设计先行原则 学会画流程图等

在进行功能开发前,尽量先通过流程图等把逻辑梳理清楚,把需求弄明白后再进行代码开发,逻辑理清楚了,才不会在测试阶段因为逻辑问题导致花费大把时间反复修改bug,甚至需要推倒重来

8 先写类、方法,再从低到高补充代码实现

先写出整个代码逻辑方法框架,再去实现具体代码,能让代码书写更清晰,最重要的是能保证逻辑上不出问题

9 不要在代码直接使用常量

比如下面代码,我们需要把com.xxx.action.VOICE提取出来,便于常量管理、修改

修改前
("com.xxx.action.VOICE".equals(action)) {
}
修改后:
private static final String ACTION_XX_VOICE="com.hebu.action.VOICE";
(ACTION_XX_VOICE.equals(action)) {
}

对于数值,由于我们无法快速了解其含义,所以尽量封装成常量,并通过名字进行区分,以下面为例,可以增加代码的可读性:

修改前:
if (type == 10000) {  
      ...
} else if (type == 10001) {  
      ...
} else if(type == 10005){
      ...
} 

修改后:
private static final String GD_ADD="10000";
private static final String GD_QUERY="10001";
private static final String GD_DELETE="10005";

if (type == GD_ADD) {  
      ...
} else if (type == GD_QUERY) {  
      ...
} else if(type == GD_DELETE){
      ...
} 

10 避免过多的if else

有很多人写代码都是这样的,这样的代码让人看的头皮发麻

     if (...) {
            if (...) {
            } else {
                if (...) {
                } else {
                    if (...) {
                    } else {

                    }
                }
            }
        } else {

        }

那么如何优化?可以从这几点出发:
1、将else中的判断尽量提取到方法最前面,这样前置判断逻辑可以显得更加清晰

        if(size<0){
            return;
        }
        if(a!=9){
            return;
        }
        if (...) {
           ...
        }

2、将子方法尽量提取出来,避免一个方法做太多的事情
3、策略模式,接口抽取,每种策略实现该接口,分别实现对应的功能

11 尽量避免频繁创建大量、临时的小对象

频繁分配内存&垃圾GC回收,会导致内存抖动,容易出现卡顿

12 慎用枚举

枚举比占用的内存空间要比标准类型大。因为它会把每一个对象声明为一个类对象
比如:

public enum Animal {
    DOG,CAT
}

javap对类编译后,可以看到,实际上是创建了一个Animal类,且创建了DOG、CAT两个类对象,所以每个枚举对象实际都是static final的类对象,所以枚举跟两个静态INT常量比内存,那肯定是多得多的。

public final class Animal extends java.lang.Enum<Animal> {
  public static final Animal DOG;
  public static final Animal CAT;
  public static Animal[] values();
  public static Animal valueOf(java.lang.String);
  static {};
}

感兴趣推荐看下此篇文章:
从一道面试题开始说起 枚举、动态代理的原理 https://blog.csdn.net/lmj623565791/article/details/79278864

13 单例构建传getApplicationContext()

单例模式生命周期和应用生命周期一致,这样长生命周期的单例对象持有短生命周期Activity的引用,会导致内存泄漏。所以一定要传ApplicationContext,如果单例类调用过多,可以像下面一样在单例类中将context统一转化为ApplicationContext

public static XXXX getInstance(Context context) {
       this.context=context.getApplicationContext();
}

本篇记录平常常见编码的注意要点,持续更新...喜欢请点赞!谢谢

上一篇下一篇

猜你喜欢

热点阅读