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一文


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

并欢迎提出问题,共同进步。谢谢


更多相关文章

  1. Android学习笔记(三一):线程:Message和Runnable
  2. android多线程数据存储 - ThreadLocal的工作原理
  3. java基础---多线程---java内存模型
  4. java 使用Callable和Future返回线程执行的结果
  5. Java多线程聊天对话框
  6. Android 多线程下载文件原理霸气解析介绍 (完结版)-----greendao
  7. Java多线程六:线程优先级和yield()让步函数
  8. java多线程爬虫
  9. javafx 和netty 混合使用出现线程不一致问题,求大神指点

随机推荐

  1. linux上/proc/cpuinfo中的bug是什么意思?
  2. 导出内存(linux中)
  3. 詹金斯死了,但是pid文件存在
  4. Linux BT下载(3)-与Tracker交互
  5. 【linux】下的mkfifo 命令 和【C语言】中
  6. Linux下的文件时间
  7. 第五章 个人优化vim第二步: 开启自带辅助
  8. Media-S 简介(一个开源的DRM解决方案)
  9. Linux-2.6 所有版本内核源码下载
  10. linux下main thread如何使用pthread_join