最近一年做Android项目过程中,对其的一些注意事项(优化)以及问题总结(二)
1.Executors线程池
当你采用new Thread().start()申请一个线程,并启动的时候,可能会发现对系统没有多大的影响,当你若是同一时间内申请了,10个,100个,线程执行完毕以后,资源并不会被立马主动释放,而是通过java虚拟机去释放。因此这样就造成了需要被回收的大量的资源被占据,而这些资源没有被回收,便造成了可使用的资源越来越少,最终导致一些意外产生。这个时候Executors线程池的作用就体现出来了。表面上看也是申请了N个线程资源,但其实仅仅只是申请了一些有限的线程资源,而其他的线程执行的时候,重复利用这些使用过的资源。
当为newSingleThreadExecutor时候
线程为实现Runnable接口的实体类;
无论该实体类实例化多少次,即ExecutorService.submit(该实体类实例) ExecutorService都只有一个该实例类的实例在运行。newCachedThreadPool
当提交一个新的任务时候,首先检查现有线程没有可用的,若没有,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
newFixedThreadPool
申请N个固定的线程资源供调用者使用,若想要使用该资源的用户过多,排队等待,采用FIFO方式
2.提供几种线程安全的数据格式
List<T> CopyOnWriteArrayList<T>
ConcurrentHashMap<key,value>; 强烈推荐该数据类型,首先该数据类型是线程安全的,其次它比其他的一些线程安全的要更加效率,至于锁原理 可以参看http://www.iteye.com/topic/344876
3.Context的静态引用
就个人而言,我推荐除非在万不得已的情况下,不要使用Context的静态引用。例如这样写
static ClassA classA;
onCreate()
{
classA = new ClassA(this);
}
这样便造成了Context的静态引用。边造成了Context无法被回收。
4.隐式引用
在写ListView的适配器时候,有些人喜欢把Adapter写成Activity,Fragment等的内部类,而这些内部类有可能并不是静态的,而在Java中,非静态内部类有个对外部类实例有个隐式引用。当你的Adapter正在做一些事情的时候,Fragment突然销毁,而由于这个隐式引用存在,Fragement无法被正常回收。
5.ArrayMap
在Android的开发过程中,在数据量不大的情况下,应该尽量避免使用HashMap这种类型的数据格式,相比ArrayMap而言,ArrayMap占用内存少,查找效率高于HashMap,注意使用该数据类型的时候,大小范围最好在1000以下。
6.枚举类型
若是开发SDK供第三方调用,请少量或者不要使用枚举,因为若是对SDK采用动态加载的方式的时候,对SDK的大小是有限制的,本人做过测试,没有使用过枚举的SDK比使用了仅仅5个枚举变量的SDK大小少了许多,至于为何会发生这种事情,请参看http://android.tgbus.com/Android/tutorial/200812/170879.shtml一文
以上全属本人在近一年的开发过程中所遇到的问题,以及解决方法。难免有所欠缺,还请多多见谅。
并欢迎提出问题,共同进步。谢谢
更多相关文章
- Android学习笔记(三一):线程:Message和Runnable
- android多线程数据存储 - ThreadLocal的工作原理
- java基础---多线程---java内存模型
- java 使用Callable和Future返回线程执行的结果
- Java多线程聊天对话框
- Android 多线程下载文件原理霸气解析介绍 (完结版)-----greendao
- Java多线程六:线程优先级和yield()让步函数
- java多线程爬虫
- javafx 和netty 混合使用出现线程不一致问题,求大神指点