线程、handler 备注

本文详细介绍了Android应用中主线程与子线程之间的消息传递机制,包括如何使用Thread+Handler进行双向通信,以及如何利用HandlerThread简化开发流程。



Android是基于Java的,所以也分主线程,子线程! 
主线程:实现业务逻辑、UI绘制更新、各子线程串连,类似于将军; 
子线程:完成耗时(联网取数据、SD卡数据加载、后台长时间运行)操作,类似于小兵; 

一、子线程向主线程发消息(Thread+handler): 
1、主线程中定义Handler: 

Java代码  收藏代码
  1. Handler mHandler = new Handler(){  
  2.   
  3.     @Override  
  4.     public void handleMessage(Message msg) {  
  5.         super.handleMessage(msg);  
  6.         switch (msg.what) {  
  7.         case 0:  
  8.             //do something,refresh UI;  
  9.             break;  
  10.         default:  
  11.             break;  
  12.         }  
  13.     }  
  14.       
  15. };  


2、子线程处理完耗时操作之后发消息给主线程,更新UI: 
Java代码  收藏代码
  1. mHandler.sendEmptyMessage(0);  

这样在子线程与主线程任务分工的条件下完成了消息交互; 

二、主线程向子线程发送消息(Thread+handler): 
主线程碰到耗时操作要子线程完成,此时发通知给子线程,操作步骤如下: 
1、子线程中定义Handler,Handler定义在哪个线程中,就跟那个线程绑定,在线程中绑定Handler需要调用Looper.prepare();方法,主线程中不调用是因为主线程默认帮你调用了; 
Java代码  收藏代码
  1. public class LoopThread implements Runnable {  
  2.   
  3.     public Handler mHandler = null;  
  4.   
  5.     @Override  
  6.     public void run() {  
  7.         Looper.prepare();  
  8.         mHandler = new Handler() {  
  9.             public void handleMessage(Message msg) {  
  10.                 String result = NetUtil.getJsonContent("北京");  
  11.                 //完成了获取北京天气的操作;  
  12.                 Log.i("test""handler"+result);  
  13.             }  
  14.         };  
  15.         Looper.loop();  
  16.     }  
  17.   
  18. }  

其中Looper.prepare();和Looper.loop();维护了一个消息队列,等待消息注入并在子线程中执行; 
2、主线程中这样调用: 
Java代码  收藏代码
  1. lThread.mHandler.sendEmptyMessage(0);  


主线程向子线程发消息,让子线程执行指定的操作,在Android中还有一种方法,即:HandlerThread,看下面的例子: 
Java代码  收藏代码
  1. HandlerThread handlerThread = new HandlerThread("jerome");  
  2. handlerThread.start();  
  3.   
  4. /** 
  5.  * 这里要将HandlerThread创建的looper传递给threadHandler,即完成绑定; 
  6.  */  
  7. threadHandler = new Handler(handlerThread.getLooper()) {  
  8.   
  9.     @Override  
  10.     public void handleMessage(Message msg) {  
  11.         super.handleMessage(msg);  
  12.         switch (msg.what) {  
  13.         case 0:  
  14. 这儿可以做耗时的操作;  
  15.             Log.i("jerome""hello,I am sub thread");  
  16.             break;  
  17.         default:  
  18.             break;  
  19.         }  
  20.     }  
  21. };  









/* * module_vision.c * * Created on: Feb 20, 2025 * Author: XWM */ #include <module/module_vision/module_vision.h> #include <algorithm/json/cJSON.h> #include <driver/driver_uart/uart.h> #include <driver/driver_power/driver_power.h> #include <string.h> static vision_t vision; static vision_data_t vision_data; static vision_send_t vision_send; /* * 函数名 :vision_init * 功能 :视觉组件初始化 * 参数 :无 * 返回值 :无 * 备注 :无 */ void vision_init(void) { memset(&vision, 0, sizeof(vision_t)); memset(&vision_data, 0, sizeof(vision_data_t)); memset(&vision_send, 0, sizeof(vision_send_t)); /* 视觉电源开启需要一定条件,所以不在这里开启 */ power_vision_enable(false); // power_vision_enable(true); } /* * 函数名 :vision_mode_set * 功能 :视觉模式设置 * 参数 :mode参考枚举体vision_mode_e * 返回值 :无 * 备注 :无 */ void vision_mode_set(vision_mode_e mode) { /* 机器当前模式为目标模式或(目标模式不等于机器通讯模式且视觉模式等于当前模式),则退出 */ if(vision.mode == mode || (mode != VISION_MODE_COMMUNICATION && vision_data.mode == mode - 1)) { return; } vision.mode = mode; } /* * 函数名 :vision_get * 功能 :视觉状态相关参数获取 * 参数 :无 * 返回值 :参考结构体vision_t * 备注 :无 */ vision_t vision_get(void) { return vision; } /* * 函数名 :vision_data_get * 功能 :视觉数据获取 * 参数 :无 * 返回值 :参考结构体vision_data_t * 备注 :无 */ vision_data_t vision_data_get(void) { return vision_data; } /* * 函数名 :vision_send_get * 功能 :视觉发送相关状态获取 * 参数 :无 * 返回值 :参考结构体vision_send_t * 备注 :无 */ vision_send_t vision_send_get(void) { return vision_send; } /* * 函数名 :vision_data_parse * 功能 :视觉数据解析 * 参数 :data数据 length长度 * 返回值 :无 * 备注 :对应2025/06/20的视觉版本 */ static void vision_data_parse(uint8_t *rx_data, uint32_t length) { /* 查找是否为JSON数据 */ cJSON *json = cJSON_Parse((const char *)uart5_handler.rx_buff); if(json == NULL) { return; } /* 查找json的子对象有没有mode字段 */ cJSON *mode = cJSON_GetObjectItem(json, "mode"); if(mode == NULL) { cJSON_Delete(json); return; } /* 查找json的子对象有没有error字段 */ cJSON *error = cJSON_GetObjectItem(json, "error"); if(error == NULL) { cJSON_Delete(json); return; } /* 查找json的子对象有没有data字段 */ cJSON *data = cJSON_GetObjectItem(json, "data"); if(data == NULL) { cJSON_Delete(json); return; } /* 查找data的子对象有没有grass字段 */ cJSON *cjson_grass = cJSON_GetObjectItem(data, "grass"); if(cjson_grass == NULL) { cJSON_Delete(json); return; } /* 查找data的子对象有没有angle字段 */ cJSON *cjson_angle = cJSON_GetObjectItem(data, "angle"); if(cjson_angle == NULL) { cJSON_Delete(json); return; } /* 查找data的子对象有没有barrier字段 */ cJSON *cjson_barrier = cJSON_GetObjectItem(data, "barrier"); if(cjson_barrier == NULL) { cJSON_Delete(json); return; } /* 查找data的子对象有没有id字段 */ cJSON *cjson_id = cJSON_GetObjectItem(data, "id"); if(cjson_id == NULL) { cJSON_Delete(json); return; } /* 查找data的子对象有没有chargeAngele字段 */ cJSON *cjson_charge_angle = cJSON_GetObjectItem(data, "chargeAngle"); if(cjson_charge_angle == NULL) { cJSON_Delete(json); return; } /* 查找data的子对象有没有chargeAssistAngle字段 */ cJSON *cjson_charge_assistAngle = cJSON_GetObjectItem(data, "chargeAssistAngle"); if(cjson_charge_assistAngle == NULL) { cJSON_Delete(json); return; } /* 查找data的子对象有没有chargeDistance字段 */ cJSON *cjson_charge_distance= cJSON_GetObjectItem(data, "chargeDistance"); if(cjson_charge_distance == NULL) { cJSON_Delete(json); return; } /* 查找data的子对象有没有markerAngle字段 */ cJSON *marker_angle = cJSON_GetObjectItem(data, "markerAngle"); if(marker_angle == NULL) { cJSON_Delete(json); return; } /* 查找data的子对象有没有markerDisdance字段 */ cJSON *marker_dist = cJSON_GetObjectItem(data, "markerDistance"); if(marker_dist == NULL) { cJSON_Delete(json); return; } /* 查找json的子对象有没有version字段 */ cJSON *cjson_version = cJSON_GetObjectItem(json, "version"); if(cjson_version == NULL) { cJSON_Delete(json); return; } /* 查找json的子对象有没有checksum字段 */ cJSON *cjson_checksum = cJSON_GetObjectItem(json, "checksum"); if(cjson_checksum == NULL) { cJSON_Delete(json); return; } /* 校验数据的准确性 */ if((mode->valueint + error->valueint + cjson_grass->valueint + cjson_angle->valueint + cjson_barrier->valueint + cjson_id->valueint + cjson_charge_angle->valueint + cjson_charge_assistAngle->valueint + cjson_charge_distance->valueint + marker_angle->valueint + marker_dist->valueint + cjson_version->valueint) != cjson_checksum->valueint) { cJSON_Delete(json); return; } /* 更新视觉状态和超时时间 */ vision.status = VISION_STATUS_CONNECTED; vision.timer = 0; /* 更新视觉数据 */ vision_data.mode = mode->valueint; vision_data.error = error->valueint; vision_data.grass = cjson_grass->valueint; vision_data.angle = -cjson_angle->valueint; vision_data.barrier = cjson_barrier->valueint; vision_data.id = cjson_id->valueint; vision_data.charge_angle = cjson_charge_angle->valueint; vision_data.charge_assistAngle = cjson_charge_assistAngle->valueint; vision_data.charge_distance = cjson_charge_distance->valueint; vision_data.marker_angle = marker_angle->valueint; vision_data.marker_dist = marker_dist->valueint; vision_data.version = cjson_version->valueint; vision_data.checksum = cjson_checksum->valueint; cJSON_Delete(json); } /* * 函数名 :vision_command_send * 功能 :发送视觉指令并等待响应 * 参数 :command发送指令 * :para期待指令 * :timeout超时时间(毫秒) * 返回值 :参考枚举体vision_send_e * 备注 :无 */ static vision_send_e vision_command_send(char* command, uint8_t para, uint32_t timeout) { /* 等待响应 */ if(vision_send.is_wait) { /* 接收超时 */ if(vision_send.timer > timeout) { vision_send.is_wait = false; return VISION_SEND_ERROR; } /* 等到的数据返回,确认是不是期望的结果 */ else { if(uart5_handler.rx_finish) { fifo_read(uart5_handler.rx_fifo, uart5_handler.rx_buff, uart5_handler.rx_count); /* 查找是否为JSON数据 */ cJSON *json = cJSON_Parse((const char *)uart5_handler.rx_buff); if(json == NULL) { uart_rx_clear(&uart5_handler); return VISION_SEND_ERROR; } /* 查找json的子对象有没有command字段 */ cJSON *cjson_command = cJSON_GetObjectItem(json, command); if(cjson_command == NULL) { cJSON_Delete(json); uart_rx_clear(&uart5_handler); return VISION_SEND_ERROR; } /* 查找json的子对象有没有checksum字段 */ cJSON *cjson_checksum = cJSON_GetObjectItem(json, "checksum"); if(cjson_checksum == NULL) { cJSON_Delete(json); uart_rx_clear(&uart5_handler); return VISION_SEND_ERROR; } /* 校验和不正确 */ if(cjson_command->valueint != cjson_checksum->valueint) { cJSON_Delete(json); uart_rx_clear(&uart5_handler); return VISION_SEND_ERROR; } /* 应答指令不正确 */ if(cjson_command->valueint != para || cjson_checksum->valueint != para) { cJSON_Delete(json); uart_rx_clear(&uart5_handler); return VISION_SEND_ERROR; } cJSON_Delete(json); /* 应答正确 */ vision_data.mode = para; return VISION_SEND_OK; } } } else { /* 清空超时时间计时 */ vision_send.timer = 0; /* 置为发送等待 */ vision_send.is_wait = true; /* 累计发送次数 */ vision_send.retransmission_count++; /* 清空fifo */ uart_rx_clear(&uart5_handler); /* 创建json数据包错误 */ cJSON *json = cJSON_CreateObject(); if(json == NULL) { return VISION_SEND_ERROR; } /* 添加command字段和参数 */ cJSON_AddNumberToObject(json, command, para); /* 添加checksum字段和参数 */ cJSON_AddNumberToObject(json, "checksum", para); /* 生成未格式化的json字符串 */ char *json_string = cJSON_PrintUnformatted(json); if(json_string) { uart5_printf("%s\r\n", json_string); cJSON_free(json_string); } cJSON_Delete(json); } return VISION_SEND_WAIT; } /* * 函数名 :vision_run * 功能 :视觉组件运行 * 参数 :无 * 返回值 :无 * 备注 :无 */ void vision_run(void) { switch(vision.mode) { case VISION_MODE_COMMUNICATION: { if(uart5_handler.rx_finish) { fifo_read(uart5_handler.rx_fifo, uart5_handler.rx_buff, uart5_handler.rx_count); // uart3_printf("%s\r\n", uart5_handler.rx_buff); vision_data_parse(uart5_handler.rx_buff, uart5_handler.rx_count); uart_rx_clear(&uart5_handler); } /* 这里视觉电源单独出来是因为视觉要等待电源稳定后才可以正常启动 */ else if(vision.timer > VISION_DELAY_POWER && !POWER_VISION_STATUS()) { vision.timer = 0; power_vision_enable(true); } else if(vision.timer > VISION_OVERTIME) { vision.timer = 0; power_vision_enable(false); } else if(vision.timer > 1 * 1000) { vision.status = VISION_STATUS_DISCONNECTED; } break; } case VISION_MODE_IDLE_SET: { if(vision_command_send("mode", 0, 1000) == VISION_SEND_OK) { uart_rx_clear(&uart5_handler); vision.mode = VISION_MODE_COMMUNICATION; } break; } case VISION_MODE_EDGE_SET: { if(vision_command_send("mode", 1, 1000) == VISION_SEND_OK) { uart_rx_clear(&uart5_handler); vision.mode = VISION_MODE_COMMUNICATION; } break; } case VISION_MODE_GRASS_SET: { if(vision_command_send("mode", 2, 1000) == VISION_SEND_OK) { uart_rx_clear(&uart5_handler); vision.mode = VISION_MODE_COMMUNICATION; } break; } case VISION_MODE_PILE_SET: { if(vision_command_send("mode", 3, 1000) == VISION_SEND_OK) { uart_rx_clear(&uart5_handler); vision.mode = VISION_MODE_COMMUNICATION; } break; } case VISION_MODE_BRIDGE_SET: { if(vision_command_send("mode", 4, 1000) == VISION_SEND_OK) { uart_rx_clear(&uart5_handler); vision.mode = VISION_MODE_COMMUNICATION; } break; } case VISION_MODE_SLEEP_SET: { if(vision_command_send("sleep", 1, 1000) == VISION_SEND_OK) { uart_rx_clear(&uart5_handler); vision.status = VISION_STATUS_DISCONNECTED; vision.mode = VISION_MODE_COMMUNICATION; } break; } default: break; } } /* * 函数名 :vision_timer_1ms_execute * 功能 :视觉组件计时 * 参数 :无 * 返回值 :无 * 备注 :无 */ void vision_timer_1ms_execute(void) { vision.timer++; vision_send.timer++; } 添加注释
最新发布
08-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值