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

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开发