【学习笔记】Android的线程和线程池

除了传统的Thread之外,还包含AsyncTask、HandlerThread、以及IntentService,这三者的底层实现也是线程

AsyncTask 并发

从实现上来讲,AsyncTask封装了Thread和Handler,经过AsyncTask能够更加方便地执行后台任务以及在主线程中访问UI 异步

可是,AsyncTask并不适合进行特别耗时的后台任务,对于特别耗时的任务来讲,建议使用线程池。 spa

AsyncTask是一个抽象的泛型类,它提供了Params、Progress、和Result这三个泛型参数, 线程

其中Params表示参数的类型,Progress表示后台任务的执行进度的类型,而Result则表示后台任务的返回结果的类型。 对象

若是不须要传递具体的参数,那么这三个泛型参数能够用Void来代替。 it


  • onPreExecute() 在主线程中执行,在异步任务执行以前。通常能够用于一些准备工做

  • doInBackground(Params... params),在线程池中执行,此方法可用于执行异步任务,params参数表示异步任务的输入参数。

  • onProgressUpdate(Progress...values),在主线程中执行,当后台任务的执行进度发生改变时会调用

  • onPostExecute(Result result),在主线程中执行,在异步任务执行以后,此方法会调用,result参数是后台任务的返回值。

此外还提供了onCancelled()方法,一样在主线程中执行,当异步任务被取消,onCancelled()方法会被调用,这个时候onPostExecute则不会被调用。 后台

AsyncTask在具体的使用过程当中也是有 一些条件限制的,主要有: 泛型

  • AsyncTask的类必须在主线程中加载,这就意味着第一次访问AsyncTask必须发生在主线程中,固然这个过程在Android4.1及以上版本中已经被系统自动完成。

    Android5.0中,ActivityThread的main方法中,它会调用AsyncTask的init方法,这就知足了AsyncTask的类必须在主线程中进行加载这个条件了。 date

  • AsyncTask的对象必须在主线程中建立

  • execute方法必须在UI线程调用

  • 不要在程序中直接调用onPreExecute()、onPostExecute()、doInBackground和onProgressUpdate方法

  • 一个AsyncTask对象只能执行一次,即只能调用一次execute方法

  • 在Android1.6以前,AsyncTask是串行执行任务的,Android1.6的时候开始采用线程池处理并行任务, 可是从Android3.0开始,为了不AsyncTask所带来的并发错误,AsyncTask又采用一个线程来串行执行任务, 尽管如此,在Android3.0及以后的版本中,咱们仍能够经过AsyncTask的executeOnExecutor方法来并行地执行任务。
相关文章
相关标签/搜索