Android之Handler详解

本文介绍了 Android 中 Handler 的两种使用模型:默认模型下消息队列绑定于主线程,及在子线程发送消息到主线程队列的场景。通过示例代码详细展示了如何使用 sendMessage 方法来发送不同类型的 Message,并在主线程中处理这些消息。

sendMessage版本的Handler的使用

这里介绍几种模型:

a、默认的Handler(消息处理队列挂在主线程上)

 Java代码 复制代码 收藏代码

[java] view plaincopy
  1. <span style="font-size:16px;">    package com.dxyh.test;     
  2.         
  3.     import android.app.Activity;     
  4.     import android.os.Bundle;     
  5.     import android.os.Handler;     
  6.     import android.os.Message;     
  7.     import android.util.Log;     
  8.     import android.view.View;     
  9.     import android.view.View.OnClickListener;     
  10.     import android.widget.Button;     
  11.         
  12.     public class MainActivity extends Activity     
  13.                       implements OnClickListener {     
  14.         private final static String TAG = "HandlerTest";     
  15.              
  16.         private final static int TASK_BEGIN = 1;     
  17.         private final static int TASK_1 = 2;     
  18.         private final static int TASK_2 = 3;     
  19.         private final static int TASK_END   = 4;     
  20.              
  21.         private Button btnStart = null;     
  22.         private Button btnStop = null;     
  23.              
  24.         /** Called when the activity is first created. */    
  25.         @Override    
  26.         public void onCreate(Bundle savedInstanceState) {     
  27.             super.onCreate(savedInstanceState);     
  28.             setContentView(R.layout.main);     
  29.                  
  30.             btnStart = (Button) findViewById(R.id.btn_start);     
  31.             btnStart.setOnClickListener(this);     
  32.             btnStop = (Button) findViewById(R.id.btn_stop);     
  33.             btnStop.setOnClickListener(this);     
  34.                  
  35.             Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]");     
  36.         }     
  37.              
  38.         Handler mHandler = new Handler() {     
  39.             // 注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框     
  40.             @Override    
  41.             public void handleMessage(Message msg) {     
  42.                 switch (msg.what) {     
  43.                 case TASK_BEGIN:     
  44.                     Log.i(TAG, "[H_TID:" +     
  45.                         Thread.currentThread().getId() + "] Get TASK_BEGIN");     
  46.                     break;     
  47.                          
  48.                 case TASK_1:     
  49.                     Log.i(TAG, "[H_TID:" +     
  50.                         Thread.currentThread().getId() + "] Get TASK_1");     
  51.                     break;     
  52.                          
  53.                 case TASK_2:     
  54.                     Log.i(TAG, "[H_TID:" +     
  55.                         Thread.currentThread().getId() + "] Get TASK_2");     
  56.                     break;     
  57.                          
  58.                 case TASK_END:     
  59.                     Log.i(TAG, "[H_TID:" +     
  60.                         Thread.currentThread().getId() + "] Get TASK_END");     
  61.                     finish();     
  62.                     break;     
  63.                 }     
  64.                 super.handleMessage(msg);     
  65.             }     
  66.         };     
  67.              
  68.         public void onClick(View view) {     
  69.             switch (view.getId()) {     
  70.             case R.id.btn_start:     
  71.                 // 启动任务(消息只有标识,立即投递)     
  72.                 mHandler.sendEmptyMessage(TASK_BEGIN);     
  73.                 Log.i(TAG, "Send TASK_BEGIN to handler.");     
  74.                      
  75.                 // 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)     
  76.                 Message msg1 = mHandler.obtainMessage(TASK_1);     
  77.                 msg1.obj = "This is task1";     
  78.                 mHandler.sendMessage(msg1);     
  79.                 Log.i(TAG, "Send TASK_1 to handler.");     
  80.                      
  81.                 // 开启任务2(和上面类似)     
  82.                 Message msg2 = Message.obtain();     
  83.                 msg2.arg1 = 10;     
  84.                 msg2.arg2 = 20;     
  85.                 msg2.what = TASK_2;     
  86.                 mHandler.sendMessage(msg2);     
  87.                 Log.i(TAG, "Send TASK_2 to handler.");     
  88.                 break;     
  89.                      
  90.             case R.id.btn_stop:     
  91.                 // 结束任务(空消息体,延时2s投递)     
  92.                 mHandler.sendEmptyMessageDelayed(TASK_END, 2000);     
  93.                 Log.i(TAG, "Send TASK_END to handler.");     
  94.                 break;     
  95.             }     
  96.     }     
  97.     }  </span>  

运行结果:

b、消息队列仍绑定在主线程上,但在子线程中发送消息。

Java代码 复制代码 收藏代码
[java] view plaincopy
  1. <span style="font-size:16px;">    package com.dxyh.test;     
  2.         
  3.     import android.app.Activity;     
  4.     import android.os.Bundle;     
  5.     import android.os.Handler;     
  6.     import android.os.Message;     
  7.     import android.util.Log;     
  8.         
  9.     public class MainActivity extends Activity {     
  10.         private final static String TAG = "HandlerTest";     
  11.              
  12.         private final static int TASK_BEGIN = 1;     
  13.         private final static int TASK_1 = 2;     
  14.         private final static int TASK_2 = 3;     
  15.         private final static int TASK_END   = 4;     
  16.              
  17.         /** Called when the activity is first created. */    
  18.         @Override    
  19.         public void onCreate(Bundle savedInstanceState) {     
  20.             super.onCreate(savedInstanceState);     
  21.             setContentView(R.layout.main);     
  22.                  
  23.             Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +     
  24.                     "This is in main thread.");     
  25.                  
  26.             workThread.start();     
  27.         }     
  28.              
  29.         Handler mHandler = new Handler() {     
  30.             // 注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框     
  31.             @Override    
  32.             public void handleMessage(Message msg) {     
  33.                 switch (msg.what) {     
  34.                 case TASK_BEGIN:     
  35.                     Log.i(TAG, "[H_TID:" +     
  36.                     Thread.currentThread().getId() + "] Get TASK_BEGIN");     
  37.                     break;     
  38.                          
  39.                 case TASK_1:     
  40.                     Log.i(TAG, "[H_TID:" +     
  41.                     Thread.currentThread().getId() + "] Get TASK_1");     
  42.                     break;     
  43.                          
  44.                 case TASK_2:     
  45.                     Log.i(TAG, "[H_TID:" +     
  46.                     Thread.currentThread().getId() + "] Get TASK_2");     
  47.                     break;     
  48.                          
  49.                 case TASK_END:     
  50.                     Log.i(TAG, "[H_TID:" +     
  51.                     Thread.currentThread().getId() + "] Get TASK_END");     
  52.                     finish();     
  53.                     break;     
  54.                 }     
  55.                 super.handleMessage(msg);     
  56.             }     
  57.         };     
  58.              
  59.         Thread workThread = new Thread() {     
  60.             // 你可以在run方法内做任何耗时的操作,然后将结果以消息形式投递到主线程的消息队列中     
  61.             @Override    
  62.             public void run() {     
  63.                 // 启动任务(消息只有标识,立即投递)     
  64.                 mHandler.sendEmptyMessage(TASK_BEGIN);     
  65.                 Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +     
  66.                         "Send TASK_START to handler.");     
  67.                      
  68.                 // 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)     
  69.                 Message msg1 = mHandler.obtainMessage(TASK_1);     
  70.                 msg1.obj = "This is task1";     
  71.                 mHandler.sendMessage(msg1);     
  72.                 Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +     
  73.                         "Send TASK_1 to handler.");     
  74.                      
  75.                 // 开启任务2(和上面类似)     
  76.                 Message msg2 = Message.obtain();     
  77.                 msg2.arg1 = 10;     
  78.                 msg2.arg2 = 20;     
  79.                 msg2.what = TASK_2;     
  80.                 mHandler.sendMessage(msg2);     
  81.                 Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +     
  82.                         "Send TASK_2 to handler.");     
  83.                      
  84.                 // 结束任务(空消息体,延时2s投递)     
  85.                 mHandler.sendEmptyMessageDelayed(TASK_END, 2000);     
  86.                 Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +     
  87.                         "Send TASK_END to handler.");     
  88.             }     
  89.         };     
  90.     }    
  91.   
  92. </span>  
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值