您的位置:首页 > 移动开发 > Android开发

Android使用异步的误区(关于Handler.post的操作方式)

2014-09-29 14:17 337 查看


一.遇到的状况

有这样一个问题值得我们思考,若把一些通讯的(既耗时且不一定有结果)写在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的作用

1.安排消息或Runnable 在某个主线程中某个地方执行。

2.安排一个动作在另外的线程中执行。

三.handler.post()的测试:

Runnable thread=new Runnable(){



@Override

public void run() {

// TODO Auto-generated method stub

System.out.println("HandlerThread:"+Thread.currentThread().getId());



}


这个程序看上去似乎实现了Handler的异步机制,
handler.post(thread)似乎实现了新启线程的作用,不过通过执行我们发现,两个线程的ID相同!也就是说,实际上thread还是原来 的主线程,由此可见,handler.post()方法并未真正新建线程,只是在原线程上执行而已,我们并未实现异步机制。

因此真正的异步应该为:

定义一个线程。
      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的处理上进行封装,真正实现了异步操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐