文档章节

【学习笔记】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方法来并行地执行任务。

© 著作权归作者所有

鬼风
粉丝 13
博文 116
码字总数 32745
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

【JavaScript】callee 与 caller

callee callee是函数参数arguments对象的一个属性,它指向参数arguments对象所在的函数自身。 function foo (x) {console.log(arguments.callee);return x;}foo(); 从控制台中可以看...

小草先森
29分钟前
2
0
全面剖析 Knative Eventing 0.6 版本新特性

摘要: Knative Eventing 0.6 版本已经于5月15号正式发布。相比于0.5版本,此次发布包含了一些重要特性及更新。针对这些新特性以及更新,我们如何快速、精准的定位主要技术点。本篇文章针对这...

阿里云云栖社区
31分钟前
9
0
ffmpeg常用命令

1.合并两个或多个视频文件 将a.flv b.flv合并为c.flv 编辑文件flvs.txt file 'a.flv'file 'b.flv' #ffmpeg -f concat -i flvs.txt -c copy c.flv...

硅谷课堂
32分钟前
1
0
MySQL面试题--常见的四种隔离级别

什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个...

寰宇01
32分钟前
2
0
Docker 安装 reids

0、mac上安装docker brew cask install docker 1、查询reidis docker search redis 2、拉取redis最新版本(也可以拉取指定版本,如:docker pull redis:4.0) docker pull redis 3、查看镜像 ...

moon888
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部