当一个应用程序启动时,Android 会启动一个Linux进程和一个主线程。
Android中所有的组件都在指定的进程的主线程进行实例化,对于系统的响应方法也都是在这个主线程中响应的。所以在系统调用时间较长的操作时,不应放到主线程中进行处理,应该在本进程中新建一个线程进行处理。
单线程模型:
当一个应用程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主要负责处理与UI有关的事件,并把相关事件分发到对应的组件中进行处理。所以主线程通常被叫做为UI线程。
在Android开发时,必须遵循单线程模型:UI的操作不是线程安全的,所以对于UI的操作必须放到主线程中进行操作。
如果幕后的线程来执行UI对象,Android就会发出错误讯息 CalledFromWrongThreadException。
Message Queue 和Handler的关系:
Message消息:(线程见通信的媒介)
Handler 处理者:(线程消息的处理者)
Handler用来负责消息Message的发送,以及在响应MessageQueue的消息处理。
使用Handler,需要implement 该类的 handleMessage(Message) 方法,它是处理这些Message的操作内容
Message Queue消息队列:
用来处理Handler发送的Message信息,按照先进先出执行。
每一个线程都有自己的MessageQueue和自己管理线程的Looper
Handle的作用是将Message放入到特定线程的MessageQueue中进行处理
Handler会向MessageQueue以两种方式发送消息:sendMessage 和post
这两种消息都会插在MessageQueue的队尾并按照先进先出进行执行。
区别:
SendMessage发送的是一个message对象,会被handler的handleMessage的函数进行处理。
Post发送的是一个runnable对象,会自己执行。