为什么要使用线程?
(1). 当主线程执行的操作时间过长,就无法执行其他操作. 消息队列中的消息无法处理,UI界面就不会更新,用户时间也不会处理.
(2). 如果主线程执行一个操作超过5秒, Android可能会弹出一个应用程序没有响应的对话框, 你的Activity就可能被杀掉
为什么要使用线程?
(1). UI线程中的操作要尽量短小,费时的操作(如网络连接,数据库访问)等要在单独的线程中完成.
(2). 如果UI线程超过5s没有响应用户请求,会弹出ANR的对话框.
(3). 常见的耗时操作如下:
网络连接和网络数据的获取
对存储器的读写
大量数据的计算
消息队列(MessageQueue)
Android采用一种复杂的Message Queue机制保证线程间通信.
Message Queue是一个消息队列, 用来存放通过Handler发布的消息.
Android在第一次启动程序时会默认为UI线程创建一个关联的消息队列,用来管理程序的组件,
如Activity,Service, Broatcast Receiver等.
可以在工作线程中创建Handler与UI线程通信.
Handler的消息传递机制
(1). 工作线程可以通过Handler对象和主线程通讯
(2).Handler对象的所有工作将在主线程中执行
(3).Handler类需要实现handlerMessage()方法,来处理消息队列中取出的Message对象
(4).HandlerMessage()方法由主线程调用,可以在需要的时候更新UI界面.但是,必须确保此方法快速完成,因为其他UI操作会等待它完成才能执行.
(5).可以在Message中附加不同的参数
public void onClick(View v){
//使用线程完成
//工作线程是一个匿名类
new Thread(){
@Override
public void run(){
for (int i=0; i<100; i++){
Message msg = new Message(); //创建Message发送给handler
msg.what = 0x0001; //what是消息的唯一标识,必须有
msg.arg1 = i;
handler.sendMessage(msg);
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
// handler创建
Private Handler = new Handler(){
@Override
public void handleMessage(Message msg){
super.handleMessage(msg){
if (msg.what == 0x0001){
int index = msg.arg1;
tvTest.setText(index+"");
}
}
}
}