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

一.遇到的状况

有这样一个问题值得我们思考,若把一些通讯的(既耗时且不一定有结果)写在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()的测试:
  1. Runnable thread=new Runnable(){ 
  2.  
  3. @Override 
  4. public void run() { 
  5. // TODO Auto-generated method stub 
  6. System.out.println("HandlerThread:"+Thread.currentThread().getId()); 
  7.  
 
这个程序看上去似乎实现了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的处理上进行封装,真正实现了异步操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值