Android中的线程
2016-02-29 23:36
253 查看
Android中的线程
以前对线程很模糊,很虚幻,后来我就问自己Android中为什么要引入线程,然后我就自己回答说“因为一个线程做不好,所以要引入别的线程”,比如在耗时操作、子线程中更新UI,下面的文字只是为了记住些东西,这些东西虽然很少,但是我学习过程中积累的过程。android中除了传统的Tread以外,还包含AsyncTask、HandlerThread、IntentService,这三个的底层的实现也是线程。
1.AsyncTask
是一种轻量级的异步任务类,方便子线程中更新UI,,可以在线程池中执行后台任务,然后把最终的结果传递给主线程,并在主线程中更新UI,从功能上说AsyncTask封装了Thread和Handler,通过A...T可以方便的执行后台任务以及在主线程中访问UI,但是A...T并不适合特别耗时的后台任务,因此,特别耗时的建议使用线程池。AsyncTask是一个抽象的泛型类,它提供了Params、Progress和Result这三个泛型参数,其中Params表示参数的类型,Progress表示后台任务的执行进度的类型,result表示后台任务的返回结果的类型,如果不需要传递参数,那么这三个参数可以用viod来代替,AsyncTask这个类的声明如下。
public abstract class AsyncTask<Params,Progress,Result>
AsyncTask有四个核心方法:
1.onPreExecute(),
2.doInBackground(Params...params)
3.onProgressUpdate(Progress...values)
4.onPostExecute(Result result)
除了上述四个方法外,A...T还提供了onCancelled(),这个方法在主线程中执行,当异步任务取消时,会被调用。这个时候onPostExecutr(Result result)不会被执行。
如果要实现一个用于模拟文件下载的类,则可以继承AsyncTask这个类。
A...T在使用过程中也是有一些条件限制:
1、A...T的类必须在主线程中加载
2、A...T的对象必须在主线程中创建
3、A...T方法必须在UI线程调用
4、不要在程序中直接调用onPreExcute、onPostExcute、doInBackGround和onProgressUpdate方法。
5、一个A...T对象只能执行一次,即只能调用一次execute方法,否则会报运行时异常。
6、在Android1.6之前,AsyncTask是串行执行任务的,Android1.6的时候AsyncTask开始采用线程池里处理并行任务,但是从3.0开始,为了避免AsyncTask所带来的并发错误,AsyncTask又采用一个线程来串行执行任务。尽管如此,在3.0及以后我们仍然可以executeOnExecutor方法来执行并行地执行任务。
2.HandlerThread
handlerThread继承了Thread,它是一种可以使用handler的Thread,实现方法很简单,就是在run方法中通过looper.prepare()来创建消息队列,并通过looper.loop()开启消息循环 ,这样在消息循环中就允许在HandlerThread创建Thread了。HandlerThread与普通的Thread的不同之处:普通的Thread主要用于在run方法中执行一个耗时任务,而HandlerThread在内部创建了消息队列,外界通过Handler的消息方式来通知HandlerThread执行一个具体的任务。3.IntentService
IntentService是一种特殊的Service它继承了Service并且它是一个抽象来,因此必须创建它的子类才能使用IntentService。IntentService可用于执行后台耗时的任务,当任务执行后它会自动停止,又由于IntentService是服务的原因,这导致它的优先级比单纯的线程要高很多,所以IntentService比较适合执行优先级比较高的后台任务。事实上IntentService封装了HandlerThread和Handler。相关文章推荐
- Android实现表情 抓取新浪表情
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#通过Semaphore类控制线程队列的方法
- C#多线程处理多个队列数据的方法
- C#实现线程安全的简易日志记录方法
- C#中线程同步对象的方法分析
- ASP.NET线程相关配置
- 浅析linux环境下一个进程最多能有多少个线程
- 再谈JavaScript线程
- C#实现终止正在执行的线程