您的位置:首页 > 移动开发 > Android开发

最近一年做Android项目过程中,对其的一些注意事项(优化)以及问题总结(二)

2015-11-01 22:36 465 查看
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一文

以上全属本人在近一年的开发过程中所遇到的问题,以及解决方法。难免有所欠缺,还请多多见谅。

并欢迎提出问题,共同进步。谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: