一、Looper、Handler、MessageQueue、Message
Looper:用于封装消息循环,,并且有一个消息队列(MessageQueue)。一个线程可以有一个Looper,主线程默认有一个Looper。
Handler:辅助类,封装了消息投递、消息处理等接口,能够将message插入到Looper的消息队列中。
MessageQueue:使用Intent、Message、Runnable作为载体在不同线程之间进行传递。
Message:内部中有一个Handler,通过此Handler处理Message。
二、AsyncTask
可以实现UI线程与后台线程的切换,如下载并显示图片,通过onPreExecute()方法显示加载框,doInBackground()方法执行在工作线程中,用来处理那些繁重的任务,如下载图片,一旦任务执行完毕,就会调用 onPostExecute()方法返回到主线程,显示图片。
AsyncTask使用注意点:
1、默认的execute()方法是Task内共享,如果同一个Task内有20个AsyncTask.execute(),那么只要有一个AsyncTask正在运行,其他AsyncTask就会阻塞。
改进方法:使用executeOnExecutor的线程池调度方案。
2、AsyncTask的doInBackground()方法需要考虑取消流程,即在doInBackground()的关键流程处,添加isCancelled()判断。并通过onCancelled()方法判断AsyncTask是否被取消。
3、不要把AsyncTask写成Activity的内部类,避免因为AsyncTask的生命周期与Activity不同导致的内存泄露。
三、HandlerThread
封装有Looper、Handler、MessageQueue的线程,使用子线程的Handler的处理后台操作,然后通过主线程的Handler完成UI更新。
HandlerThread 比较合适处理那些在工作线程执行,需要花费时间偏长的任务。我们只需要把任务发送给 HandlerThread,然后就只需要等待任务执行结束的时候通知返回到主线程就好了。
四、ThreadPool
Thread的缺点:
a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,J线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。
Android线程池对应api:ThreadPoolExecutor
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.MILLISECONDS,// 时间单位
new LinkedBlockingQueue<Runnable>(),// 线程队列
Executors.defaultThreadFactory());//线程工厂
可以与AsyncTask配合使用:
asyncTask.executeOnExecutor(executor,paras);
五、IntentService
我们知道Service是运行在主线程的,如果需要Service处理后台信息,就需要自己创建新线程执行,并且任务执行完成后需要手动stopService.
根据sdk中IntentService的注释可知:IntentService是一个基于Service的一个类,用来处理异步的请求。你可以通过startService(Intent)来提交请求,该Service会在需要的时候创建,当完成所有的任务以后自己关闭,且请求是在工作线程处理的。
即不需要自己去new Thread,也不需要考虑在什么时候关闭该Service了。
六、线程优先级设置
可以使用android.os.Process.setThreadPriority(int)设置线程优先级,范围-20~19,值越小优先级越大。