博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【学习笔记】Android的线程和线程池
阅读量:6851 次
发布时间:2019-06-26

本文共 1299 字,大约阅读时间需要 4 分钟。

hot3.png

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

AsyncTask

从实现上来说,AsyncTask封装了Thread和Handler,通过AsyncTask可以更加方便地执行后台任务以及在主线程中访问UI

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

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

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

如果不需要传递具体的参数,那么这三个泛型参数可以用Void来代替。

  • 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的类必须在主线程中进行加载这个条件了。

  • AsyncTask的对象必须在主线程中创建
  • execute方法必须在UI线程调用
  • 不要在程序中直接调用onPreExecute()、onPostExecute()、doInBackground和onProgressUpdate方法
  • 一个AsyncTask对象只能执行一次,即只能调用一次execute方法
  • 在Android1.6之前,AsyncTask是串行执行任务的,Android1.6的时候开始采用线程池处理并行任务,
    但是从Android3.0开始,为了避免AsyncTask所带来的并发错误,AsyncTask又采用一个线程来串行执行任务,
    尽管如此,在Android3.0及之后的版本中,我们仍可以通过AsyncTask的executeOnExecutor方法来并行地执行任务。

转载于:https://my.oschina.net/gabriel1215/blog/626137

你可能感兴趣的文章
LeetCode - Nth Highest Salary
查看>>
9.ORM数据访问
查看>>
在RHEL5下搭建SSH远程登录服务器
查看>>
使用Moblin SDK开发应用程序 -- Image Creator
查看>>
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记14 视图绘制Demo
查看>>
/dev/null &
查看>>
在Ubuntu上安装Node.js的Upstream版本
查看>>
扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text
查看>>
CISCO路由器配置基础(3)
查看>>
linux下通过串口登陆交换机
查看>>
微信公众平台群发规则说明
查看>>
LINUX下直接使用ISO文件
查看>>
第四章 apache的工作模式
查看>>
mysql备份和恢复总结
查看>>
软件明明已经删除 控制面板里还有名称
查看>>
深入浅出的SQL server 查询优化
查看>>
Hyper-V vNext新的虚拟机配置文件、配置版本
查看>>
通俗易懂,各常用线程池的执行 流程图
查看>>
CentOS 6.4 安装python2.7/mysqldb/ipython
查看>>
hive0.11 hiveserver custom认证bug
查看>>