- 当主线程执行的操作时间过长,就无法执行其他操作。消息队列中的消息无法处理,UI界面就不会更新,用户事件也不会处理。
- 如果主线程执行一个操作超过5秒,Android可能会弹出一个应用程序没有响应的对话框,你的Activity可能会被杀掉
Ul线程中的操作要尽量短小,费时的操作(如网络连接,数据库访问)等要在单独的线程中完成。如果Ul线程超过5s没有响应用户请求,会弹出ANR的对话框。常见的耗时操作如下:
- 网络连接和网络数据的获取
- 对存储器的读写
- 大量的数据计算
消息队列MessageQueue:
- Android采用种复杂的Message Queue机制保证线程间通信。
- Message Queue是一个消息队列,用来存放通过Handler发布的消息。Android在第一次启动程序时会默认为UI线程创建一个关联的消息队列,用来管理程序的组件,如Activity,Service ,Broatcast Receiver等。
- 可以在工作线程中创建Handler与U线程通信。
- 工作线程可以通过Handler对象和主线程通讯,Handler对象的所有工作将在主线程中执行
- Handler类需要实现handleMessage()方法,来处理消息队列中取出的Message对象。
- handleMessage ()方法由主线程调用,可以在需要的时候更新UI界面。但是,必须确保此方法快速完成,因为其他UI操作会等待它完成才能执行。
- 可以在Message中附加不同的参数
eg:
MainActivity中:
switch (view . getId()) {
case R. id. btnAsync:
//使用线程完成
//工作线程是一个匠名类
new Thread() {
I
public void run() {|
for (int i=0;i<100;i++) {
//tvTest. setText (+"") ;//不允许,子线程不可更新UI线程中控件的属性
Message msg = new Message () ;
msg.what=0x0001; //消息的what是消息标识,必须有
msg.arg1=i;
handler.sendMessage (msg) ;
try {
Thread.sleep (1000) ;
} catch (InterruptedException e) {
e .printstackTrace() ;
}
}
};
}
private TextView tvTest;
private Handler handler = new Handler() {
public void handleMessage (android. os .Message msg) {
//处理消息,运行在主线程中
switch (msg.what) {
case 0x0001:
int index-msg.arg1 ;
tvTest. setText (index+"") ;//允许,因为运行在主线程中
break ;
}
};
};