当前位置:编程学堂 > Android Handler使用详解——别说你不懂handler(转)

Android Handler使用详解——别说你不懂handler(转)

  • 发布:2023-10-06 06:13

-->

我们在开发Android的时候,Handler可以说是一个使用得非常频繁的概念,它的用处是不言而喻的。本文详细介绍了Handler的基本概念和使用方法。

Handler基本概念

Handler主要用于异步消息处理:发送消息后,首先进入消息队列,发送消息的函数立即返回,其他部分一条一条地从消息队列中取出消息然后进行处理时,消息的发送和接收并不是同步处理的。这种机制通常用于处理比较长的操作。

Handler工具类在多线程中有两个应用:

  1。发送信息。在不同线程之间发送消息。使用的方法是sendXXX();。

  android.os.Handler对象通过以下方法发送消息:
  sendEmptyMessage(int),发送空消息;
  sendMessage(Message),发送消息,消息可以携带参数;
  sendMessageAtTime(Message, long),在未来某个时间点发送消息;
  sendMessageDelayed(Message, long),延迟消息发送Nms。

2。计划一个任务,并在将来执行某个任务,使用的方法是postXXX();。

  android.os.Handler对象通过以下方法执行定时任务:
  post(Runnable),提交定时任务立即执行;
  postAtTime(Runnable, long),提交计划任务在未来某个时间点执行;
  postDelayed(Runnable, long),提交计划任务,延迟Nms。

我们通过一个例子简单介绍一下Handler。

示例 1:应用程序中有 2 个按钮(开始、结束)。当点击开始按钮时,就会执行一个线程。该线程在控制台上输出一个字符串,并每 3 秒重新启动一次。执行线程一次,直到单击结束按钮,线程停止。

下图为本应用的界面:

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

开发步骤:

1。创建一个新的 Android 应用程序

2。在布局文件中添加2个Button控件标签并设置其属性和值

3。在Activity中声明控制变量,根据id获取控制对象

4。在Activity中,创建一个Handler对象

5。在Activity中,创建一个Runnable对象

a) 以匿名内部类的形式

b) 将要执行的操作写入Runnable对象中的run()方法中

i。打印出一句话

ii。调用Runnable对象的postDelayed()方法

6。在Activity中编写开始按钮所需的监听并绑定。

在该监听器的Onclick()方法中,调用Handler的Post()方法,将要执行的线程对象放入队列中。

7。在Activity中,编写结束按钮所需的监听器并帮助确定。

在此监听器的Onclick()方法中,调用Handler的removeCallbacks()方法,删除队列中未执行的线程对象。

以下是Activity的代码:

Java代码
  1. package android.handler;
  2. 导入android.app.Activity;
  3. 导入 android.os.Bundle;
  4. 导入 android.os.Handler;
  5. 导入 android.view.View;
  6. 导入 android.view.View.OnClickListener;
  7. 导入android.widget.Button;
  8. 公共课程 HandlerTest 扩展了 Activity {
  9. /** 首次创建活动时调用。 */
  10. 私有按钮开始按钮;
  11. 私有按钮endButton;
  12. @Override
  13. public void onCreate(捆绑已保存实例状态){
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.main);
  16. //根据id获得控件对象
  17. startButton = (Button)findViewById(R.id.startButton);
  18. endButton = (Button)findViewById(R.id.endButton);
  19. //为控件设置监听器
  20. startButton.setOnClickListener(new StartButtonListener());
  21. endButton.setOnClickListener(new EndButtonListener());
  22. }
  23. 类 StartButtonListener 实现 OnClickListener{
  24. public void onClick(View v){
  25. //调用Handler的post()方法,将要执行的线程对象放置在队列中
  26. www.sychzs.cn(updateThread);
  27. }
  28. }
  29. 类 EndButtonListener 实现 OnClickListener{
  30. public void onClick(View v) {
  31. //调用Handler的removeCallbacks()方法删除队列中未执行的线程对象
  32. handler.removeCallbacks(updateThread);
  33. }
  34. }
  35. //创建Handler对象
  36. Handler handler = new Handler();
  37. //创建新的线程对象
  38. Runnable updateThread = new Runnable(){
  39. //将要执行的操作写入线程对象的run方法中
  40. public void run(){
  41. System.out.println("updateThread");
  42. //调用Handler的postDelayed()方法
  43. //该方法的作用是将要执行的线程对象放入队列中,时间结束后,运行指定的线程对象
  44. //第一个参数为Runnable类型:要执行的线程对象
  45. //第二个参数为long类型:延迟时间,单位毫秒
  46. handler.postDelayed(updateThread, 3000);
  47. }
  48. };
  49. }

示例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对象,即消息对象。首先,设置进度条的进度(这个值是Message对象中的成员变量arg1)。

ii。将要执行的线程对象放入队列中。

6。编写Button需要的监听并绑定

a) 设置进度条为显示状态。

b) 将要执行的线程对象放入队列中。

以下是Activity的代码:

Java代码
    1. package android.handler;
    2. 导入android.app.Activity;
    3. 导入 android.os.Bundle;
    4. 导入 android.os.Handler;
    5. 导入 android.os.Message;
    6. 导入 android.view.View;
    7. 导入 android.view.View.OnClickListener;
    8. 导入 android.widget.Button;
    9. 导入 android.widget.ProgressBar;
    10. 公共类 ProgressBarHandlerTest 扩展 Activity {
    11. /** 首次创建活动时调用。 */
    12. 私有进度条进度条;
    13. 私有按钮开始按钮;
    14. @Override
    15. public void onCreate(捆绑已保存实例状态){
    16. super.onCreate(savedInstanceState);
    17. setContentView(R.layout.main);
    18. progressBar = (ProgressBar)findViewById(R.id.progressbar);
    19. startButton = (Button)findViewById(R.id.startButton);
    20. startButton.setOnClickListener(new ProgressBarOnClickListener());
    21. }
    22. ProgressBarOnClickListener 类实现 OnClickListener{
    23. public void onClick(View v){
    24. //设置细节条为可见状态
    25. progressBar.setVisibility(View.VISIBLE);
    26. www.sychzs.cn(updateThread);
    27. }
    28. }
    29. //使用匿名内部类来复写Handler缺少的handlerMessage()方法
    30. Handler updateBarHandler = new Handler(){
    31. @Override
    32. public voidhandleMessage(Message msg){
    33. progressBar.setProgress(msg.arg1);
    34. www.sychzs.cn(updateThread); //将要执行的线程放入队列中
    35. }
    36. };
    37. //Thread类,该类是使用匿名内部类声明的
    38. Runnable updateThread = new Runnable(){
    39. int i = 0;
    40. public void run() {
    41. // TODO 自动生成方法存根
    42. System.out.println("开始线程");
    43. i+=10;
    44. //获取消息对象。 Message类是android系统提供的
    45. Message msg = updateBarHandler.obtainMessage();
    46. //设置Message对象的arg1参数值为i
    47. msg.arg1 = i; //使用两个成员变量arg1和arg2来传输消息。优点是系统性能消耗少
    48. 尝试{
    49. Thread.sleep(1000); //让当前线程休眠1000毫秒
    50. }catch(InterruptedException ex){
    51. ex.printStackTrace();
    52. }
    53. //将Message对象添加到消息队列中
    54. updateBarHandler.sendMessage(msg);
    55. //如果i的值等于100
    56. 如果(i == 100){
    57. //从队列中移除线程对象
    58. updateBarHandler.removeCallbacks(updateThread);
    59. }
    60. }
    61. };
    62. }
-->

相关文章