开发中可以避免的问题

本文题图:Photo by Samuel Zeller on Unsplash

做 Android 开发马上已经一年了,虽然中间有些磕磕绊绊,但总体来说还算是不小的进步,从编码技巧到规范上有些自己的想法,这些想法有些成为了自己的编码规范。持续更新……

强烈推荐阿里开源的代码检查规范

Java

  1. 空指针异常,不要想当然的以为一个对象不会为空,在使用 equal 的时候,将常量放在左边。判断是非为空也将常量放在左边;
  2. 重写类的 equals 方法也要重写类的 hashCode 方法;
  3. 数据类重写 toString() 方法;
  4. StringBuffer 比 StringBuilder 更高效,同时也是线程安全的。但是 StringBuilder 在单线程下比 StringBuffer 更高效。
  5. 在进行除法运算的时候一定要判断除数不能为0;
  6. 涉及到字符串比较注意是否考虑中英文以及大小写;
  7. String.valueOf(new Object()) 可能返回一个 null 字符串
  8. 字符串截取的时候,必须要判断长度是否足够截取;
  9. 文件复制后建议校验文件完整性;
  10. List addAll 方法得到的 List 只要不将其中的对象取出来进行修改,原 List 中的数据不会改变,原因:List 的内存地址不同,但是 List 元素的地址相同,可以进行 remove(index)、remove(object)、add(object)操作;
  11. 随机数 nextInt(),其中的范围数只能为正数;
  12. 一个类非 static 修饰的成员变量,在其他 子类实例化时,都会开辟一个新的内存空间进行存放,所以,父类 A 中的 List 不为空时,B 类中 List 可能为空。
  13. list 的 foreach 循环不能在其中进行修改元素,会报错,也不能向其中添加以及存在的 item;
  14. 在 List 中使用多次 remove ,由于 i 在不停的增大,Size 也在不停的减小,故达不到效果,可采用 list.subList().clear;

Android

  1. EditText 设置单行 maxLines 无效的情况下可以使用 SingleLine="true"

  2. TextView.setText() 是不能存放 int 类型的值如果存入 int 类型的值回被系统认定为 资源文件,如果要存只能是字符串;

  3. 设置输入框不弹出软键盘,可以使用 EditText.setInputType(InputType.Null);

  4. 使用图片集来实现动画时, drawable list 的形式,太过占用内存,使用 FrameAnimation 构建动画,大大缓解内存占用 低内存帧动画;

  5. RecyclerView 优化:

  6. 减少布局层级,避免过多的 Item View 的无用布局的嵌套;

  7. 对于有图片的列表,在滑动时不进行加载图片,停止滑动之后再加载图片;

  8. 避免在 Adapter 的填充数据时做过多的计算,或嵌套过多的逻辑计算,对于复杂的计算结果应当在 Adapter 填充数据之前计算完成,例如将 String 转为 SpannableString 的计算过程就可以放在 java bean 中进行实现;

  9. 点击事件可以放在 ViewHolder 中,onBindView 只做数据的绑定渲染;

  10. 减少 onMeasure() 和 onLayout() 的次数,可以使用一个弱引用的缓存数组和实现 View 对象的缓存。

  11. BufferKinfe 如果出现问题,一个是 没导包 compiler 一个是包名异常,以 javaAndroid 开头了。

  12. ADB 内网调试(Windows 下):

    1. 使用 USB 连接到设备,如果连接不上,可使用豌豆荚或其他第三方软件进行连接;
    2. 进入欲控制的 adb shell ;
    3. 进入设备控制台之后输入:setprop service.adb.tcp.port 5555
    4. 拔掉 USB ,查看设备内网 IP 地址;
    5. adb connect <IP地址>
    6. 如连接不成功,关闭开发者选项,再打开(如果是国内第三方 ROM 可以将其他的一些设置打开)。
    7. 使用步骤 5 再来一次,如果还是不行,从 步骤 2 再来一次。
  13. RecyclerView 如果使用 notifyItemRemove();这个方法,虽然数据与视图都有变动,但移除的 item 后的 item position 还是没有产生变化,需要再次调用 notifyItemChanged() 这个方法;

    notifyItemRemoved(position);
    notifyItemRangeChanged(position, getItemCount() - position);
    
  14. 动态添加 RadioButton 时布局文件一定不能有父布局,否则,单选变多选;

  15. RecycleView 或是 ListView、GridView 等 Adapter View 如果实现了缓存机制,在涉及到多种状态的情况下,务必及时保存当前的状态信息。例如 CheckBox、RadioButton、EditText 将当前的状态写入到所属对象中,如果所属对象不能进行添加数据,考虑使用 Map 或 SparseArray 进行状态信息保存;

  16. OnBackPressd 不一定被调用,但是监听 OnKeyDown 一定能监听到 返回键;onBackPressed 方法可能跟 super 有关;

  17. 引用第三方的 SDK 出现问题,先去检查一下基本配置,如包名之类的,再去检查一下手机的设置,是否部分权限没有打开。

  18. RecyclerView Item 布局显示异常,可能跟 ItemView 的创建有关,使用 LayoutInflater. inflate 第二个方法不为空试试。