一.遇到的状况
有这样一个问题值得我们思考,若把一些通讯的(既耗时且不一定有结果)写在Activity(主线程)里,会导致Activity阻塞,长时间无响应,直至页面假死(如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "Thread signal is 478921")。因此,我们需要把这些耗时的操作放在单独的子线程中操作。这就是Handler的使命。Handler提供异步处理的功能,发送和接收不是同时的(Activity的主线程和线程队列里的线程是不同的线程,并行进行,互不影响)。
然而,当我们使用了Thread和Handler的处理方式的时候如:
AHandler ahandler = new Handler();
AThread aThread=new Thread(handler);
在aThread的方法体里,我们实现的是:
private class AThread extends Thread{
private AHandler handler;
public AThread (AHandler handler){
this.handler = handler;
}
public void run(){
super.run();
//执行通讯
//数据完成后,通知handler更新UI。
handler.sendMessage(msg);
}
}
在java中,线程的创建有两种方法:继承Thread类和实现Runnable接口。而这最重要的都是要复写run方法来实现线程的功能。当线程的时间片到了,开始运行时,就执行run()函数,执行完毕,就进入死亡状态。然而,按照这种方式的作用下,当线程执行通讯时发生阻塞,比如(死链)的时候,这时候,该线程被堵塞,报 "Thread signal is 478921",发生ANR异常退出。因此,从这种状况下来说,似乎是没有异步的。
二.Handler的作用
- Runnable thread=new Runnable(){
- @Override
- public void run() {
- // TODO Auto-generated method stub
- System.out.println("HandlerThread:"+Thread.currentThread().getId());
- }
定义一个线程。 class MyThread extends Thread{ Handler mHandler; Boolean boo; public MyThread(Handler handler){ mHandler = handler; } public void setBoo(boolean b) {boo = b; } publid void run(){ if(boo){ getWeatherInfo();//耗时操作 analyzing();//耗时操作 mHandler.post(new Runnable() { public void run() { setWeather();//更新UI } );//更新UI boo = true; } } }防止发生使用Handler误区,官方建议使用AsynTask的机制。AsynTask是一个轻量级的异步处理类,他是基于Handler和Thread的处理上进行封装,真正实现了异步操作。