文档章节

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

2tman
 2tman
发布于 2016/02/29 20:52
字数 663
阅读 110
收藏 3
点赞 1
评论 0

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

© 著作权归作者所有

共有 人打赏支持
2tman
粉丝 11
博文 89
码字总数 31481
作品 0
苏州
Android工程师
android开发常用工具类、高仿客户端、附近厕所、验证码助手、相机图片处理等源码

Android精选源码 android开发过程经常要用的工具类源码(http://www.apkbus.com/thread-599826-1-1.html) Android类似QQ空间个人主页下拉头部放大的布局效果(http://www.apkbus.com/thread-5...

逆鳞龙 ⋅ 05/29 ⋅ 0

AIDL跨进程Service推送消息到Activity

AIDL的概念不说了,一般都是Activity调用service的方法去获取一些东西,但是如何做到service主动回调activity的方法去推送一些东西的,这种需求一般也是会有的(比如后台有个定位,每次位置更新或...

倔强码农 ⋅ 04/11 ⋅ 0

Android中实现跨进程通信(IPC)的方式(三)之观察者模式

Android中实现跨进程通信(IPC)的方式(三)之观察者模式 前言     在Android中实现跨进程通信(IPC)的几种方式(一)中介绍了什么是多进程,为什么需要多进程,多进程的优缺点等。这篇我们将...

huangandroid ⋅ 06/03 ⋅ 0

2018 Android 面试心得,已拿到 offer

code小生,一个专注于 Android 领域的技术分享平台 作者:huisonma 链接:https://www.jianshu.com/p/855ff21e0a13 声明:本文是 huisonma 原创,转发等请联系原作者授权。 从 16 年毕业至今...

h176nhx7 ⋅ 04/16 ⋅ 0

关于Activity销毁,而绘制UI的子线程未销毁出现的问题

项目总结 --------------------------------------------------------------------------------------------------------- 有一个功能模块,需要播放音频,画一个简单的界面 一个例子: 我们...

听着music睡 ⋅ 2015/11/12 ⋅ 0

Android的进程与线程(3)线程安全问题

当一个程序启动的时候,系统会为程序创建一个名为main的线程。这个线程重要性在于它负责把事件分发给适合的用户组件,这些事件包括绘制事件。并且这个线程也是你的程序与Android UI工具包中的...

一路漫漫 ⋅ 2012/04/01 ⋅ 0

对Android Handler Message Looper常见用法,知识点的一些总结

Android 非UI线程中是不能更新UI的,Handler是Android 提供的一套更新UI的机制,也是用来发送消息和处理消息的一套机制。 以前刚接触的Handler的时候,感觉总是很困惑,对Handler原理也是一知...

猴亮屏 ⋅ 06/11 ⋅ 0

Android 多线程: 完全解析线程池ThreadPool原理&使用

前言 对于多线程,大家应该很熟悉。但是,大家了解线程池吗? 今天,我将带大家全部学习关于线程池的所有知识。 目录 1. 简介 // 通过 构造方法 配置核心参数Executor executor = new Threa...

carson_ho ⋅ 04/24 ⋅ 0

2018Android面试经历

面试中遇到的一些问题 Q1:ListView和RecyclerView的使用,就问我它们有什么区别? Q2:既然RecyclerView在很多方面能取代ListView,Google为什么没把ListView划上一条过时的横线? Q3:你用...

codeGoogle ⋅ 05/16 ⋅ 0

Android性能分析工具简介

在Android项目开发工程中,功能开发只是其中的一部分,更多的时候是优化,优化除了个人的良好习惯,往往还需要借助第三方工具。本文罗列Android优化过程中的一些常用工具借助这些工具,可以很...

code_xzh ⋅ 05/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 16分钟前 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

楠木楠 ⋅ 28分钟前 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 57分钟前 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 58分钟前 ⋅ 0

Docker Toolbox Looks like something went wrong

Docker Toolbox 重新安装后提示错误:Looks like something went wrong in step ´Checking if machine default exists´ 控制面板-->程序与应用-->启用或关闭windows功能:找到Hyper-V,如果处......

随你疯 ⋅ 今天 ⋅ 0

Guacamole 远程桌面

本文将Apache的guacamole服务的部署和应用,http://guacamole.apache.org/doc/gug/ 该链接下有全部相关知识的英文文档,如果水平ok,可以去这里仔细查看。 一、简介 Apache Guacamole 是无客...

千里明月 ⋅ 今天 ⋅ 0

nagios 安装

Nagios简介:监控网络并排除网络故障的工具:nagios,Ntop,OpenVAS,OCS,OSSIM等开源监控工具。 可以实现对网络上的服务器进行全面的监控,包括服务(apache、mysql、ntp、ftp、disk、qmail和h...

寰宇01 ⋅ 今天 ⋅ 0

AngularDart注意事项

默认情况下创建Dart项目应出现以下列表: 有时会因为不知明的原因导致列表项缺失: 此时可以通过以下步骤解决: 1.创建项目涉及到的包:stagehand 2.执行pub global activate stagehand或pub...

scooplol ⋅ 今天 ⋅ 0

Java Web如何操作Cookie的添加修改和删除

创建Cookie对象 Cookie cookie = new Cookie("id", "1"); 修改Cookie值 cookie.setValue("2"); 设置Cookie有效期和删除Cookie cookie.setMaxAge(24*60*60); // Cookie有效时间 co......

二营长意大利炮 ⋅ 今天 ⋅ 0

【每天一个JQuery特效】淡入淡出显示或隐藏窗口

我是JQuery新手爱好者,有时间就练练代码,防止手生,争取每天一个JQuery练习,在这个博客记录下学习的笔记。 本特效主要采用fadeIn()和fadeOut()方法显示淡入淡出的显示效果显示或隐藏元...

Rhymo-Wu ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部