`

android Handler

阅读更多

Handler的使用(一)

Handler基本概念:
Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。
这种机制通常用来处理相对耗时比较长的操作。

使用一个例子简单的来介绍一下Handler。
示例1:一个应用程序中有2个按钮(start、end),当点击start按钮时,执行一个线程,这个线程在控制台输出一串字符串,并且每隔3秒再执行一次线程,直到点击end按钮为止,线程停止。
下图为这个应用程序的界面:



下图为执行程序时控制台的输出:



开发步骤:
1、 新建一个Android应用程序
2、 在布局文件中添加2个Button控件标签,并为其设置属性和值
3、 在Activity中,声明控件变量并根据id获得控件对象
4、 在Activity中,创建一个Handler对象
5、 在Activity中,创建一个Runnable对象
a) 以匿名内部类的方式
b) 将要执行的操作写在Runnable对象中的run()方法中
i. 打印出一句话
ii. 调用Runnable对象的postDelayed()方法
6、 在Activity中,编写start按钮需要的监听器,并绑定
a) 在这个监听器的Onclick()方法中,调用Handler的post()方法,将要执行的线程对象放到队列当中。
7、 在Activity中,编写end按钮需要的监听器,并帮定
a) 在这个监听器的Onclick()方法中,调用Handler的removeCallbacks ()方法,删除队列当中未执行的线程对象。
b)
下面是Activity的代码:

Java代码  收藏代码
  1. package  android.handler;  
  2.   
  3. import  android.app.Activity;  
  4. import  android.os.Bundle;  
  5. import  android.os.Handler;  
  6. import  android.view.View;  
  7. import  android.view.View.OnClickListener;  
  8. import  android.widget.Button;  
  9.   
  10. public   class  HandlerTest  extends  Activity {  
  11.     /** Called when the activity is first created. */   
  12.     private  Button startButton;  
  13.     private  Button endButton;  
  14.       
  15.     @Override   
  16.     public   void  onCreate(Bundle savedInstanceState) {  
  17.         super .onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.         //根据id获得控件对象   
  20.         startButton = (Button)findViewById(R.id.startButton);  
  21.         endButton = (Button)findViewById(R.id.endButton);  
  22.         //为控件设置监听器   
  23.         startButton.setOnClickListener(new  StartButtonListener());  
  24.         endButton.setOnClickListener(new  EndButtonListener());  
  25.     }  
  26.       
  27.     class  StartButtonListener  implements  OnClickListener{  
  28.         public   void  onClick(View v) {  
  29.             //调用Handler的post()方法,将要执行的线程对象放到队列当中   
  30.             handler.post(updateThread);  
  31.         }  
  32.     }  
  33.       
  34.     class  EndButtonListener  implements  OnClickListener{  
  35.         public   void  onClick(View v) {  
  36.             //调用Handler的removeCallbacks()方法,删除队列当中未执行的线程对象   
  37.             handler.removeCallbacks(updateThread);  
  38.         }  
  39.           
  40.     }  
  41.       
  42.     //创建Handler对象   
  43.     Handler handler = new  Handler();  
  44.     //新建一个线程对象   
  45.     Runnable updateThread = new  Runnable(){  
  46.         //将要执行的操作写在线程对象的run方法当中   
  47.         public   void  run(){  
  48.             System.out.println("updateThread" );  
  49.             //调用Handler的postDelayed()方法   
  50.             //这个方法的作用是:将要执行的线程对象放入到队列当中,待时间结束后,运行制定的线程对象   
  51.             //第一个参数是Runnable类型:将要执行的线程对象   
  52.             //第二个参数是long类型:延迟的时间,以毫秒为单位   
  53.             handler.postDelayed(updateThread, 3000 );  
  54.         }  
  55.     };  
  56. }  


上面是一个最简单的例子,下面再看另外一个例子。
示例2:一个应用程序中有一个进度条和一个按钮,当点击按钮后,每隔一秒钟进度条前进一部分。
下图为应用程序的运行效果图:



开发步骤:
1、 新建一个Android应用程序
2、 在布局文件中添加一个progressBar和一个Button,并为其设置属性和值
3、 在Activity中,声明控件变量并根据id获得控件对象
4、 创建线程对象
a) 通过匿名内部类的方式
b) 在编写完了5、6步之后再来继续编写这个线程对象里的操作
i. 声明一个变量用来设置进度条的进度
ii. 重写线程类的run方法(),里面编写要执行的操作
1. 打印一个字符串
2. 进度条的值增加
3. 得到一个消息对象
4. 设置消息对象arg1的值
5. 让线程休眠一秒钟
6. 将消息对象放入到消息队列中
7. 判断,如果进度条的值等于100,则将线程对象从队列中移除。
5、 创建Handler对象
a) 与示例1不同的地方是,这里是通过匿名内部类的方式来声明的,而示例1是直接new出来的对象
b) 重写Handler对象的handlerMessage(Message msg)方法
i. 这个方法传入了一个Message对象,即消息对象,首先设置进度条的进度(这个值是Messag对象里面的一个成员变量arg1)。
ii. 将要执行的线程对象放入到队列当中
6、 编写Button需要的监听器,并绑定
a) 设置进度条为显示状态
b) 将要执行的线程对象放入到队列当中
下面是Activity的代码:

Java代码  收藏代码
  1. package  android.handler;  
  2.   
  3. import  android.app.Activity;  
  4. import  android.os.Bundle;  
  5. import  android.os.Handler;  
  6. import  android.os.Message;  
  7. import  android.view.View;  
  8. import  android.view.View.OnClickListener;  
  9. import  android.widget.Button;  
  10. import  android.widget.ProgressBar;  
  11.   
  12. public   class  ProgressBarHandlerTest  extends  Activity {  
  13.     /** Called when the activity is first created. */   
  14.       
  15.     private  ProgressBar progressBar;  
  16.     private  Button startButton;  
  17.       
  18.     @Override   
  19.     public   void  onCreate(Bundle savedInstanceState) {  
  20.         super .onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.           
  23.         progressBar = (ProgressBar)findViewById(R.id.progressbar);  
  24.         startButton = (Button)findViewById(R.id.startButton);  
  25.           
  26.         startButton.setOnClickListener(new  ProgressBarOnClickListener());  
  27.     }  
  28.       
  29.     class  ProgressBarOnClickListener  implements  OnClickListener{  
  30.         public   void  onClick(View v) {  
  31.             //设置进度条为可见状态   
  32.             progressBar.setVisibility(View.VISIBLE);  
  33.             updateBarHandler.post(updateThread);  
  34.         }  
  35.     }  
  36.       
  37.     //使用匿名内部类来复写Handler当中的handlerMessage()方法   
  38.     Handler updateBarHandler = new  Handler(){  
  39.         @Override   
  40.         public   void  handleMessage(Message msg) {  
  41.             progressBar.setProgress(msg.arg1);  
  42.             updateBarHandler.post(updateThread);    //将要执行的线程放入到队列当中   
  43.         }  
  44.     };  
  45.       
  46.     //线程类,该类使用匿名内部类的方式进行声明   
  47.     Runnable updateThread = new  Runnable(){  
  48.         int  i =  0 ;  
  49.         public   void  run() {  
  50.             // TODO Auto-generated method stub   
  51.             System.out.println("Begin Thread" );  
  52.             i+=10 ;  
  53.             //得到一个消息对象,Message类是android系统提供的   
  54.             Message msg = updateBarHandler.obtainMessage();  
  55.             //将Message对象的arg1参数的值设置为i   
  56.             msg.arg1 = i;   //用arg1、arg2这两个成员变量传递消息,优点是系统性能消耗较少   
  57.             try {  
  58.                 Thread.sleep(1000 );  //让当前线程休眠1000毫秒   
  59.             }catch (InterruptedException ex){  
  60.                 ex.printStackTrace();  
  61.             }  
  62.             //将Message对象加入到消息队列当中   
  63.             updateBarHandler.sendMessage(msg);  
  64.             //如果i的值等于100   
  65.             if  (i ==  100 ){  
  66.                 //将线程对象从队列中移除   
  67.                 updateBarHandler.removeCallbacks(updateThread);   
  68.             }  
  69.         }  
  70.     };  

上面事例二需要添加条件

  1. //使用匿名内部类来复写Handler当中的handlerMessage()方法      
  2.     Handler updateBarHandler = new  Handler(){     
  3.         @Override     
  4.         public   void  handleMessage(Message msg) {     
  5.             progressBar.setProgress(msg.arg1);    
  6.  if (msg.arg1<=progressBar.getMax()) {  
  7. updateBarHandler.removeCallbacks(updateThread);      
  8.   
  9.            }else  {  
  10. updateBarHandler.post(updateThread);    //将要执行的线程放入到队列当中      
  11.   
  12. }  
  13.         }     
  14.    }; 

 

 

 

 

转自:http://byandby.iteye.com/blog/832467

分享到:
评论

相关推荐

    Android Handler消息处理顺序分析

    在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,它们共同构建了Android的消息处理机制。本文将详细分析Android Handler消息处理的顺序,以及如何利用这些组件进行异步操作。 首先,理解...

    模拟Android Handler机制Demo

    【Android Handler机制】是Android应用程序中用于线程间通信的核心组件,它与Looper和Message紧密配合,实现消息的发送、处理以及线程间的同步。在Android应用开发中,尤其是涉及到UI更新时,Handler机制显得尤为...

    Android Handler传值的demo

    在Android开发中,`Handler`、`Message`和`Looper`是实现线程间通信的重要机制,特别是当需要在主线程(UI线程)和工作线程之间传递数据时。本示例“Android Handler传值的demo”将帮助我们深入理解这一机制。 `...

    androidHandler测试的demo

    在“androidHandler测试的demo”中,我们可以预期包含以下内容: 1. 创建自定义`Handler`子类:这个子类可能重写了`handleMessage(Message msg)`方法,根据`msg.what`的值执行不同的操作,比如更新UI元素或执行特定...

    老罗android Handler综合练习 图文混排 服务器端源代码

    【标题】"老罗android Handler综合练习 图文混排 服务器端源代码"涉及的是Android应用开发中的关键知识点,主要集中在Handler机制、图文混排以及服务器端的数据交互。Handler是Android系统中用于线程间通信的重要...

    Android Handler模拟进度条更新

    由于Android的单线程模型,直接在后台线程更新UI是不允许的,这时就需要用到Handler、Looper和Message机制来实现跨线程通信,特别是用于模拟进度条更新,让用户体验更加友好。本篇文章将深入探讨如何使用Android ...

    android handler例子

    在Android开发中,`Handler`是一个至关重要的组件,它用于处理与线程通信相关的任务,尤其是在主线程(UI线程)和工作线程之间。`Handler`、`Looper`和`Message`三者共同构成了Android的消息传递机制。下面将详细...

    Android Handler解析

    # Android Handler解析 在Android应用开发中,保持应用程序的响应性是至关重要的。为了实现这一目标,我们需要确保UI线程不会被阻塞。通常来说,将耗时的任务(如网络请求、复杂计算等)放到后台线程执行可以提高UI...

    android handler的一些测试

    在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,特别是用于主线程(UI线程)与其他工作线程之间的交互。标题“android handler的一些测试”暗示我们将探讨`Handler`如何在多线程环境...

    Android Handler类详解

    Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解

    Android Handler运行原理

    ### Android Handler运行原理详解 #### 一、引言 在Android开发中,线程间通信是非常重要的技术之一,其中Handler机制被广泛应用于实现主线程与子线程之间的数据交互。Handler机制不仅简单易用,而且功能强大,是...

    Android Handler机制的工作原理详析

    Android Handler机制的工作原理详析 Android Handler机制是Android系统中的一种消息机制,负责处理应用程序中的消息处理和线程之间的通信。Handler机制的工作原理可以分为以下几个部分:Looper、MessageQueue、...

    Android handler message奇怪用法详解

    Handler是Android中的一个类,它用于在不同的线程之间发送和处理消息。通常,我们使用Handler配合Looper和Message来实现在主线程(UI线程)中执行后台任务的结果。Looper是消息队列的循环器,它不断检查消息队列并...

    Android Handler 原理分析及实例代码

    在Android开发中,`Handler` 是一个至关重要的组件,它涉及到多线程、UI更新以及消息传递机制。本文将深入探讨 `Handler` 的工作原理,分析其如何在不同线程间进行通信,并通过实例代码来展示其具体用法。 ### ...

    android handler 机制 源码

    在Android系统中,Handler、Looper和Message构成了一个用于线程间通信的重要机制。这个机制使得UI线程可以处理来自其他线程的消息,从而避免了直接在非UI线程操作UI组件,防止应用出现ANR(Application Not ...

    Android Handler 图片浏览器

    在Android开发中,Handler是一种非常重要的组件,它与线程通信密切相关,特别是在更新UI和处理异步任务时。本文将深入探讨如何利用Handler构建一个图片浏览器,并结合计时器(Timer)来实现特定功能。 首先,理解...

    Android Handler机制解析

    Android Handler机制解析 Android Handler机制是Android系统中的一种机制,用于处理线程之间的通信和消息传递。在Android系统中,Handler机制是基于Java的线程机制来实现的。下面将对Android Handler机制进行详细的...

    Android Handler定时更新UI

    在Android应用开发中,Handler是实现线程间通信的关键组件,尤其在涉及到UI更新时,它的作用尤为重要。本文将深入探讨“Android Handler定时更新UI”的相关知识点,以及如何使用CounterDemo来实现这一功能。 首先,...

    android-Handler的使用

    【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...

    Android Handler 线程 示例代码

    在Android开发中,`Handler`、`Thread`、`Toast`、`消息队列`以及`线程`是实现UI交互和异步处理的关键概念。本文将深入探讨这些概念,并结合给定的"Android Handler 线程 示例代码"进行详细讲解。 首先,我们来看`...

Global site tag (gtag.js) - Google Analytics