Android 日常开发总结的技术经验( 二 )


34. 建议整个应用维护一个dbhelper实例,只要db没有关闭,全局就只有一个db实例,多线程并发写入db不会lock,严格交替进行写入:123123123 。。。(123代表不同线程,轮流插入一个记录),读和写均不会锁住db,读写交替并没有规律,执行次数和程度看cpu分配给哪个线程的时间片长 。
35. 一个任务使用事务嵌套N个事务,N个事务中有一个失败,这个任务整体失败,全部成功后,数据才写入,具有安全性,整体性 。并且事务写入大批量数据的效率经实际测试成百上千倍的高于一般的单个写入 。数据库大量数据、多线程操作建议使用LiteOrm数据库框架,更稳定简单 。
36. 经常需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内 。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部 。
37. Long a; 判断a有没有赋值,if(a == 0)在a没有赋值情况下会报错 。应该if(a == null),Integer、Floag等也一样,原因你懂,只是提醒你要小心喔 。
38. 编码遇到读写、出入等逻辑要双向考虑,文件导入导出,字符字节相互转换都要两边转码 。
39. 一个 int 值与一个 Integer 对象(能包含 int 值的最小对象)的大小比率约为 1:4(32位和64位机器有不同) 。额外的开销源于 JVM 用于描述 JAVA 对象的元数据也就是 Integer,(Long、Double等也是) 。
40. 对象由元数据和数据组成 。元数据包括类(指向类的指针,描述了类的类型),标记(描述了对象状态,如散列码、形状等),锁(对象同步信息) 。数组对象还包括大小的元数据 。
41. 一个在 32 位 Java 运行时中使用 1GB Java 堆的 Java 应用程序在迁移到 64 位 Java 运行时之后,通常需要使用 1.7GB 的 Java 堆 。
42. Hash 集合的访问性能比任何 List 的性能都要高,但每条目的成本也要更高 。由于访问性能方面的原因,如果您正在创建大集合(例如,用于实现缓存),那么最好使用基于 Hash 的集合,而不必考虑额外的开销 。
43. 对于并不那么注重访问性能的较小集合而言,List 则是合理的选择 。ArrayList 和 LinkedList 集合的性能大体相同,但其内存占用完全不同:ArrayList 的每条目大小要比 LinkedList 小得多,但它不是准确设置大小的 。List 要使用的正确实现是 ArrayList 还是 LinkedList 取决于 List 长度的可预测性 。如果长度未知,那么正确的选择可能是 LinkedList,因为集合包含的空白空间更少 。如果大小已知或可预知或比较小,那么 ArrayList 的内存开销会更低一些 。
43. 选择正确的集合类型使你能够在集合性能与内存占用之间达到合理的平衡 。除此之外,你可以通过正确调整集合大小来最大化填充率、最小化未得到利用的空间,从而最大限度地减少内存占用 。
44. 充分利用封装(提供接口类来控制访问数据)和委托(helper对象来实施任务)两种理念 。
45. 延迟分配 Hashtable:如果 Hashtable 为空是经常发生的普遍现象,那么仅在存在需要存储的数据时分配 Hashtable 应该是一种合理的做法 。将 Hashtable 分配为准确的大小:虽然会有默认大小,但建议使用更为准确的初始大小 。
46. EditText在setText时不要忘记是否需要setSelection 。在大多数情况下是需要设置的 。
47. XML两种情况要注意:1 属性名字时候有重复;2 注意文本是否包含非法字符,注意使用CDATA包裹 。
48. 当逻辑没有明显问题时考虑对象属性、函数参数、网络传输参数是否全部了解,是否设置正确 。
49. 当出现编译或者运行时错误,别人那没问题时,考虑你的编译环境和环境版本是否有问题 。
50. 由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuilder提升性能,多线程使用StringBuffer操作string提高程序效率 。
51. java 栈的优势是比堆速度快,可共享,主要存放临时变量、参数等,堆的优势是可动态分配内存大小 。
52. 只要是用new()来新建对象的,都会在堆中创建,而且其数据是单独存值的,即使与栈中的数据(值)相同,也不会与栈中的数据共享 。
53. 基本数据类型定义的变量称自动变量,存的是‘字面值’,存在于栈中,可共享(存在即不新建) 。
54. 多个RandomaccessFile对象指向同一个文件,可使用多个线程一起写入无需再自己加锁,经试验结论:三个线程分别写入100万次数据,使用锁约12秒,不使用约8.5秒 。100个线程分别写入1万次数据使用锁耗时约4.2秒,不使用锁耗时约3秒 。


推荐阅读