Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198376
  • 博文数量: 102
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1015
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-05 16:45
文章存档

2014年(73)

2013年(29)

我的朋友

分类: Android平台

2013-12-16 23:06:56

01_14_Handler的使用(一)
1、handler的基本概念
2、Handler的基本使用方法
3、使用handler更新ProgressBar

1、handler的基本概念
    为了不影响当前的Activity,可以再后台运行就得用到handler

2、Handler的基本使用方法
创建工程MyhandlerTest

点击(此处)折叠或打开

  1. //HandlerActivity.java
  2. package com.lwb.myhandlertest;

  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.app.Activity;

  6. import android.view.Menu;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.Button;

  10. public class HandlerActivity extends Activity {

  11.     //声明两个按钮控件
  12.     private Button startButton = null;
  13.     private Button endButton =null;
  14.     
  15.     @Override
  16.     protected void onCreate(Bundle savedInstanceState) {
  17.         super.onCreate(savedInstanceState);
  18.         setContentView(R.layout.main);
  19.         //根据ID得到代表控件的对象,并为这两个按钮设置相应的监听器
  20.         startButton=(Button)findViewById(R.id.startButton);
  21.         startButton.setOnClickListener(new StartButtonListener());
  22.         
  23.         endButton=(Button)findViewById(R.id.endButton);
  24.         endButton.setOnClickListener(new EndButtonListener());
  25.     }



  26.     
  27.     class StartButtonListener implements OnClickListener{

  28.         @Override
  29.         public void onClick(View v) {
  30.             // TODO Auto-generated method stub
  31.             //2、调用Handler的post方法,将要执行的的线程对象添加到消息队列中去
  32.             handler.post(updateThread);
  33.             //把这个线程对象updateThread加入到消息队列中去,
  34.             //并马上执行线程的run()方法
  35.         }
  36.         
  37.     }
  38.     
  39.     class EndButtonListener implements OnClickListener{

  40.         @Override
  41.         public void onClick(View v) {
  42.             // TODO Auto-generated method stub
  43.             //5、不用的时候就可以调用handler的删除
  44.             handler.removeCallbacks(updateThread);
  45.             //把这个回调接口remove掉,updateThread线程将不再执行
  46.         }
  47.         
  48.     }
  49.     
  50.     //1、创建handler对象
  51.     Handler handler=new Handler();
  52.     //3、将要执行的操作写在线程对象的run()方法中
  53.     Runnable updateThread = new Runnable(){
  54.         //这里为什么不提供复写
  55.         @Override
  56.         public void run(){ //线程体
  57.             System.out.println("UpdateThread");
  58.             //4、在run方法内部,执行postDelayed(循环)或是post(结束)方法
  59.             handler.postDelayed(updateThread, 3000);
  60.             //postBelayed()这个函数是把updateThread加入到消息队列中去,而且每个3秒加入一次
  61.         }
  62.     };

  63.     @Override
  64.     public boolean onCreateOptionsMenu(Menu menu) {
  65.         // Inflate the menu; this adds items to the action bar if it is present.
  66.         getMenuInflater().inflate(R.menu.handler, menu);
  67.         return true;
  68.     }

  69. }

12-16 12:06:47.867: I/System.out(1041): UpdateThread
12-16 12:06:50.899: I/System.out(1041): UpdateThread
12-16 12:06:53.914: I/System.out(1041): UpdateThread
看上面打印的时间(隔3s)

重要的代码:

点击(此处)折叠或打开

  1. //1、创建handler对象
  2.     Handler handler=new Handler();
  3.     //3、将要执行的操作写在线程对象的run()方法中
  4.     Runnable updateThread = new Runnable(){
  5.         //这里为什么不提供复写
  6.         @Override
  7.         public void run(){ //线程体
  8.             System.out.println("UpdateThread");
  9.             //4、在run方法内部,执行postDelayed(循环)或是post(结束)方法
  10.             handler.postDelayed(updateThread, 3000);
  11.             //postBelayed()这个函数是把updateThread加入到消息队列中去,而且每个3秒加入一次
  12.         }
  13.     };
重要的几个方法是:
post():把线程加入到消息队列。如:handler.post(updateThread);//把这个线程对象updateThread加入到消息队列中去,并马上执行线程的run()方法
postDelayed();几秒后线程加入到消息队列。如:handler.postDelayed(updateThread, 3000);postBelayed()这个函数是把updateThread加入到消息队列中去,而且每个3秒加入一次
remouveCallbacks():把线程移除。如:handler.removeCallbacks(updateThread);//把这个回调接口remove掉,updateThread线程将不再执行

3、使用handler更新ProgressBar


点击(此处)折叠或打开

  1. //main.xml
  2. <LinearLayout xmlns:android=""
  3.        android:orientation="vertical"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="match_parent"
  6.  >
  7.      <ProgressBar
  8.         android:id="@+id/bar"
  9.         style="?android:attr/progressBarStyleHorizontal"
  10.         android:layout_width="200dp"
  11.         android:layout_height="wrap_content"
  12.         android:visibility="gone"
  13.         />
  14.     <Button
  15.         android:id="@+id/startButton"
  16.         android:layout_width="fill_parent"
  17.         android:layout_height="wrap_content"
  18.         android:text="start"
  19.         />
  20. </LinearLayout>

点击(此处)折叠或打开

  1. //MyTestBarHandler.java
  2. package com.lwb.mytestbarhandler;

  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.app.Activity;
  7. import android.view.Menu;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.widget.Button;
  11. import android.widget.ProgressBar;

  12. public class MyTestBarHandler extends Activity {

  13.     //声明控件变量
  14.     ProgressBar bar=null;
  15.     Button startButton = null;
  16.     
  17.     @Override
  18.     protected void onCreate(Bundle savedInstanceState) {
  19.         super.onCreate(savedInstanceState);
  20.         setContentView(R.layout.main);
  21.         
  22.         //根据控件的ID得到代表控件的对象,并未按钮设置监听器
  23.         bar=(ProgressBar)findViewById(R.id.bar);
  24.         startButton=(Button)findViewById(R.id.startButton);
  25.         startButton.setOnClickListener(new ButtonListener());
  26.     }
  27.     
  28.     //1、当点击startButton按钮时,就会执行ButtonListener的onClick方法
  29.     class ButtonListener implements OnClickListener{

  30.         @Override
  31.         public void onClick(View v) {
  32.             // TODO Auto-generated method stub
  33.             bar.setVisibility(View.VISIBLE);//进度条设置为可见
  34.             //2、updateBarHandler.post()把线程对象updateThread加入到线程
  35.             //队列中去,并马上去执行
  36.             updateBarHandler.post(updateThread);//由此可知等下得定义一个
  37.             //handler对象 updateBarHandler 和 Thread线程对象updateThread
  38.         }    
  39.     }
  40.     
  41.     //使用匿名内部类来复写Handler当中的handlleMessge的方法,它和线程 添加消息 是异步执行的
  42.     Handler updateBarHandler = new Handler(){

  43.         @Override
  44.         public void handleMessage(Message msg) {
  45.             // TODO Auto-generated method stub
  46.             bar.setProgress(msg.arg1);//有消息队列中的信息msg中的成员来设置进度条bar的进度
  47.             updateBarHandler.post(updateThread);//循环2、updateBarHandler.post()把线程对象updateThread加入到线程
  48.             //队列中去,并马上去执行 不知线程是i又是0开始执行的么???????
  49.             //super.handleMessage(msg);
  50.         }
  51.         
  52.     };
  53.     
  54.     //handler是有两个队列的:1。线程消息队列,存放线程的。 2、Message消息队列,用于传递消息参数

  55.     //线程类,该类使用匿名内部类的方式进行声明
  56.     Runnable updateThread = new Runnable(){
  57.         int i=0;
  58.         @Override
  59.         //3、执行线程的run()方法
  60.         public void run() {
  61.             // TODO Auto-generated method stub
  62.             System.out.println("Begin Thread"+i);
  63.             i=i+10;
  64.             
  65.             //得到 一个消息对象,Message类是有Android OS提供
  66.             //4、获得Message对象msg,并把msg的成员变量arg1赋值为i
  67.             Message msg = updateBarHandler.obtainMessage();
  68.             //将msg对象的arg1成员变量设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗少
  69.             msg.arg1=i;
  70.             try{
  71.                 //设置当前显示睡眠2秒
  72.                 Thread.sleep(1000);
  73.             }catch(InterruptedException e){
  74.                 e.printStackTrace();
  75.             }
  76.             
  77.             if(i>100){
  78.                 //如果当i==100时,就将线程对象从handler当中移除掉
  79.                 updateBarHandler.removeCallbacks(updateThread);
  80.                 System.out.println(">>>>>>");
  81.             }
  82.             else{
  83.                 //6、将msg对象加入到消息队列当中,注意和updateBarHandler.post(updateThread);
  84.                 //的区别,后者是将线程押入线程队列当中去
  85.                 updateBarHandler.sendMessage(msg);
  86.                 System.out.println("<<<<<<<<");
  87.             }
  88.         }
  89.         
  90.     };
  91.     
  92.     
  93.     @Override
  94.     public boolean onCreateOptionsMenu(Menu menu) {
  95.         // Inflate the menu; this adds items to the action bar if it is present.
  96.         getMenuInflater().inflate(R.menu.my_test_bar_handler, menu);
  97.         return true;
  98.     }

  99. }
12-16 15:10:14.057: I/System.out(1318): Begin Thread0
12-16 15:10:15.128: I/System.out(1318): <<<<<<<<
12-16 15:10:15.177: I/System.out(1318): Begin Thread10
12-16 15:10:16.225: I/System.out(1318): <<<<<<<<
12-16 15:10:16.237: I/System.out(1318): Begin Thread20
12-16 15:10:17.274: I/System.out(1318): <<<<<<<<
12-16 15:10:17.277: I/System.out(1318): Begin Thread30
12-16 15:10:18.310: I/System.out(1318): <<<<<<<<
12-16 15:10:18.316: I/System.out(1318): Begin Thread40
12-16 15:10:19.381: I/System.out(1318): <<<<<<<<
12-16 15:10:19.381: I/System.out(1318): Begin Thread50
12-16 15:10:20.414: I/System.out(1318): <<<<<<<<
12-16 15:10:20.417: I/System.out(1318): Begin Thread60
12-16 15:10:21.469: I/System.out(1318): <<<<<<<<
12-16 15:10:21.497: I/System.out(1318): Begin Thread70
12-16 15:10:22.527: I/System.out(1318): <<<<<<<<
12-16 15:10:22.547: I/System.out(1318): Begin Thread80
12-16 15:10:23.580: I/System.out(1318): <<<<<<<<
12-16 15:10:23.587: I/System.out(1318): Begin Thread90
12-16 15:10:24.639: I/System.out(1318): <<<<<<<<
12-16 15:10:24.648: I/System.out(1318): Begin Thread100
12-16 15:10:25.679: I/System.out(1318): >>>>>>


handler是有两个队列的:1。线程消息队列,存放线程的。 2、Message消息队列,用于传递消息参数
他们间的关系如下:

Handler是简单的。但要多看多练,加深理解和印象




阅读(577) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~