文档章节

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

鬼风
 鬼风
发布于 2016/02/29 20:52
字数 663
阅读 110
收藏 3

除了传统的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方法来并行地执行任务。

© 著作权归作者所有

共有 人打赏支持
鬼风
粉丝 12
博文 113
码字总数 32371
作品 0
苏州
Android工程师
私信 提问
Android多线程任务优化1:探讨AsyncTask的缺陷

导语:在开发Android应用的过程中,我们需要时刻注意保障应用的稳定性和界面响应性,因为不稳定或者响应速度慢的应用将会给用户带来非常差的交互体验。在越来越讲究用户体验的大环境下,用户...

Dean83
2012/06/14
0
0
Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存 下面看他们的理解。 [size=1.8em]Handler+Runnable模式 我们先看一个并...

jxlgzwh
2013/07/25
0
0
演化理解 Android 异步加载图片

在学习"Android异步加载图像小结"这篇文章时, 发现有些地方没写清楚,我就根据我的理解,把这篇文章的代码重写整理了一遍,下面就是我的整理。 下面测试使用的layout文件: 简单来说就是 Li...

Koon.LY
2012/05/04
0
1
Android 异步编程

文章作者:朱鸿,淘宝资深架构师 原文出处:http://hugozhu.myalert.info/2014/06/29/46-async-android.html Android的线程和内存模型 Android操作系统在boot后,会启动一个Zygote(受精卵)进...

鉴客
2014/07/01
1K
1
Android Binder线程

在android系统中,通过binder进行IPC时,服务端总是会起一些Binder线程来响应客户端的请求。如下面的这个设备上,systemprocess进程中就可以看到许多名为"BinderX"的线程: 那这些Binder线程...

WolfCS
2014/03/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开源软件会被云杀死吗 ?

本文转载云头条,原作者:Michael Stiefel是Reliable Software公司的负责人,是一名软件架构和开发顾问。 文章要点 虽然开源开发不会消失,但商业开源厂商的未来不是很有希望。随着全面管理的...

linuxCool
22分钟前
0
0
OSChina 周三乱弹 —— 谈什么对象?睡什么觉?

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @胖达panda :最肯忘却古人诗,最不屑一顾是相思。分享童丽的单曲《红豆生南国》: 《红豆生南国》- 童丽 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
26分钟前
43
3
stylus

stylus基础教程,stylus实例教程,stylus语法总结

miaojiangmin
今天
3
0
PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部