第11章 Android的线程和线程池
来源:互联网 发布:网络上333是什么意思 编辑:程序博客网 时间:2024/06/06 00:05
第11章 Android的线程和线程池
除了Thread以外,在Android中可以扮演线程的角色还有很多,比如AsyncTask和IntentService,同时HandlerThread也是一种特殊的线程。
AsyncTask封装了线程池和Handler,它主要是为了方便在子线程中更新UI。HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler。IntentService是一个服务,IntentService内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出。IntentService是一种服务,不容易被系统杀死从而可以尽量保证任务的执行,如果是一个后台线程,由于这个时候进程中没有活动的四大组件,那么这个进程的优先级就会降低,容易被系统杀死,这就是IntentService的优点。
11.1 主线程和子线程
从Android3.0开始系统要求网络访问必须在子线程执行,否则网络访问将会失败并抛出NetworkOnMainThreadException这个异常。
11.2 Android中的线程形态
11.2.1 AsyncTask
AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。
4个核心方法:
- onPreExecute()
- doInBackground(Params… params)在此方法中可以通过publishProgress方法来更新任务进度,publishProgress方法会调用onProgreeUpdate方法。
- onProgressUpdate(Progress…values)
- onPostEcecute(Result result)
- onCancelled(),任务被取消时被调用,onPostExecute()不会被调用
AsyncTask在使用中的一些限制条件:
- AsyncTask的类必须在主线程中加载
- AsyncTask的对象必须在主线程中创建
- execute方法必须在UI线程调用
- 不要直接调用onPreExecute()、onPostExecute、doInBackground、onProgressUpdate方法
- 一个AsyncTask对象只能执行一次,即只能调用一次execute方法
- Android1.6之前,AyncTask是串行执行任务的,Android1.6时AsyncTask开始采用线程池处理并行任务,但是从Android3.0开始,AsyncTask又采用一个线程来串行执行任务。在Android3.0以后的版本中,可以通过AsyncTask的executeOnExecutor方法来并行执行任务。
AsyncTask的工作泳道流程图:
11.2.3 HandlerThread
HandlerThread继承了Thread,在run()方法中创建了Looper。
11.2.4 IntentService
IntentService是一种特殊的Service,继承了Service。可以用来执行耗时任务(在非UI线程执行),当任务执行后它会自动停止。
有两个停止服务的方法stopSelf()和stopSelf(int startId)。stopSelf()会立刻停止服务,stopSelf(int startId)会等待所有的的消息都处理完毕后才终止服务(原理是判断最近启动服务的id是否和startId相等)。
在onHandleIntent方法中处理耗时任务。HandlerThread继承Handler,所以一样是顺序处理消息,这意味着IntentService也是顺序执行后台任务。
- 第11章 Android的线程和线程池
- 第11章 Android的线程和线程池
- 第11章 android的线程和线程池
- 读书笔记-Android开发艺术探索-第11章-Android的线程和线程池
- 【读书笔记】【Android 开发艺术探索】第11章Android 的线程和线程池
- Android开发艺术探索读书笔记(第11章 Android的线程和线程池)
- Android的线程和线程池
- Android的线程和线程池
- Android的线程和线程池
- Android的线程和线程池
- 十一、Android的线程和线程池
- Android的线程和线程池
- Android的线程和线程池(一)
- Android的线程和线程池
- Android的线程和线程池
- Android的线程和线程池
- Android的线程和线程池
- Android的线程和线程池
- 准备起航,了解Kotlin
- 第10章 Android的消息机制
- mybatis、 jdbc、 mysql-connector 之间的关系
- 零基础写PHP扩展
- 关于Linux使用pppd拨号,自动断网,重新拨号功能
- 第11章 Android的线程和线程池
- vue动态为数据添加新属性遇到的问题
- C#位运算讲解与示例
- 第12章 Bitmap的加载和Cache
- 神经网络激活函数比较
- 自总结之在Centos7下快速安装mysql
- 第三方网站微信登录java代码实现
- 第13章 综合技术
- 纯思维导图maven教程