Android多线程API

一、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,值越小优先级越大。


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页