Android是单线程模式 只有1个Main线程也就是UI线程 各种事件,视图的绘制都是在这部分完成的
当执行耗时操作时,如果超过5S 就会出现ANR错误 因此在耗时操作时要开子线程
不能在UI线程外访问UI组件 基础操作都要在UI线程中完成,耗时操作创建新线程完成
UI线程外的线程被称为工作线程(完成耗时的操作)
多任务的实现原理
线程中通信的方式 AsyncTask和Handler机制
AsyncTask
是安卓框架中实现的异步处理的辅助类,耗时操作在工作线程中完成,处理结果在Main线程中执行
该机制屏蔽掉了多线程和handler的概念,对他们进行了高度的封装
onPreExecute预处理方法,doInBackgroud后台执行方法,publishProgress更新进度,onPostExecute返回结果方法......
handler
通过消息队列进行通信的方式,通过Handler,looper,MessageQueue和Message这几个类来协调完成
Handler 在android里负责发送和处理消息,通过它可以实现其他线程和Main线程之间的消息通讯
Looper 负责管理线程的消息队列和消息循环
MessageQueue 消息队列,先进先出,它的作用是保存有待线程处理的消息
Message 线程间通讯的载体,Message充当着消息封装的功能,里面可以存放任何想要传递的消息
具体是实现是
1.工作线程想给主线程发Messgae
2.工作线程先把Messgae发送到MessageQueue中
3.主线程中有Looper可以检测到MessgaeQueue中消息的变化,有消息时就可以取出来,这时就会掉Handler的回调handleMessage方法,拿到结果
Looper类
线程通过looper对象可以读写某个消息循环队列
·Looper.myLooper() 得到当前looper对象
·Looper.getMainLooper() 可以获得当前进程的主线程的Looper对象
·Looper.prepare() 创建消息队列
·Looper.loop() 进入消息循环
Handler类
UI主线程在被创建时会主动创建一个消息队列和消息循环,主线程的Looper通过创建1个Handler对象,对外界提供了访问消息队列的渠道
·主线程通过Handler.handleMessage()读取消息队列中的消息
·工作线程通过以下方法发送消息到主线程的消息队列
·Handler.sendMessgae()
·Handler.post()
安卓中有2种方式实现多线程来操作UI
·第一种就是创建线程Thread,通过Handler负责线程间的通信和消息
·第二种是通过AsyncTask异步执行任务
一·用Handler来实现多任务
·在新的线程中调用主线程的Handler的postXXX和sendMessage()方法来实现与主线程通信
·具体步骤如下
·1.创建一个Handler对象
·2.将要执行的操作卸载线程对象的 run方法中
·3.使用post方法运行线程对象
·4.如果需要循环执行,需要在线程对象的run方法中再次调用post方法
二 通过AsyncTask来实现多任务
通过继承AsyncTask类来实现耗时操作,该类是抽象类,有3个泛型参数 params,集成AsyncTask的类的具体实现执行execute传入参数,Progress,更新进度,有publishProgress传给onupdateProgress result返回的结果集
·具体步骤如下
·1.创建AsyncTask子类,根据需求重写其中的方法,其中doInBackground是必须实现的,完成耗时的操作
·2.创建AsyncTask的子类的实例对象,
·3.调用execute方法,开启异步线程任务