Handler的使用(一)

一、Handler的基本概念   

        Handler主要用于是对异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另一部分逐一在消息队列中将消息取出。发送消息和接受消息是异步的处理。通常情况下,都是线程,将消息取出就是执行线程的run方法。

    一个Handler对象对应一个消息队列。 

二、Handler的基本使用方法

    示例:一个应用程序中有两个按钮,当点击start按钮时,执行一个线程,并且每隔三秒再执行一次,直到点击end按钮,线程才停止。

   <Button
        android:id="@+id/startButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="start" />
   
    <Button
        android:id="@+id/endButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="end" />
public class HandlerTest extends Activity {
  private Button startButton = null;
  private Button endButton = null;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    startButton = (Button) findViewById(R.id.startButton);
    startButton.setOnClickListener(new StartButtonListener());
    endButton = (Button) findViewById(R.id.endButton);
    endButton.setOnClickListener(new EndButtonListener());
 }
 
 class StartButtonListener implements OnClickListener{
   @Override
   public void onClick(View v) {
     //将要执行的线程对象放入队列中
     handler.post(updateThread);
   }
 }
 
 class EndButtonListener implements OnClickListener{
   @Override
   public void onClick(View v) {
     //删除当前队列中未执行的线程对象
     handler.removeCallbacks(updateThread);
   }
 }
 
 //创建Handler对象
 Handler handler = new Handler();
 //新建一个线程对象
 Runnable updateThread = new Runnable() {
   @Override
   //将要执行的操作写入线程对象的run方法中
   public void run() {
     System.out.println("UpdateThread");
     //此方法的作用是:将要执行的线程对象放入到队列中,待时间结束后,运行制定的线程对象
     //第一个参数是Runnable对象,表示将要执行的线程对象
     //第二个参数是long类型,表示延迟的时间,以毫秒为单位
     handler.postDelayed(updateThread, 3000);
   }
 };
}

 

三、使用Handler更新ProgressBar

    示例:一个应用程序中有一个进度条和一个按钮,每隔一秒钟进度条前进一小部分

   <ProgressBar
        android:id="@+id/handlerpro_bar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="200dip"
        android:layout_height="wrap_content"
        android:visibility="gone" />
   
    <Button
        android:id="@+id/handlepro_startButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始" />
public class ProgressBarHandler extends Activity {
  private ProgressBar bar = null;
  private Button myStartButton = null;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    bar = (ProgressBar) findViewById(R.id.handlerpro_bar);
    myStartButton = (Button) findViewById(R.id.handlepro_startButton);
    myStartButton.setOnClickListener(new ButtonListener());
  }
 
 class ButtonListener implements OnClickListener{
   @Override
   public void onClick(View v) {
     bar.setVisibility(View.VISIBLE);
     updateBarHandler.post(updateThread);
   }
 }
 
 Handler updateBarHandler = new Handler(){
   @Override
   public void handleMessage(Message msg) {
     bar.setProgress(msg.arg1);
     updateBarHandler.post(updateThread);
  };
 };
 
 //线程类,该类使用匿名内部类的方式进行声明
 Runnable updateThread = new Runnable() {
   int i = 0;
   @Override
   public void run() {
     System.out.println("Begin Thread");
     i = i + 10;
     //得到一个消息对象,Message是由Android OS 提供
     Message msg = updateBarHandler.obtainMessage();
     //将msg的arg1参数设为i,用arg1和arg2这两个成员变量传递消息
     msg.arg1 = i;
     try {
      //设置当前显示睡眠1秒
      Thread.sleep(1000);
     } catch (InterruptedException e) {
        e.printStackTrace();
     }
     //将msg对象加入到消息队列中
     updateBarHandler.sendMessage(msg);
     if(i == 100){
      //如果当i值为100时,就将线程对象从Handler中移除
      updateBarHandler.removeCallbacks(updateThread);
     }
   }
 };
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值