安卓 UI 同步线程阻塞导致按钮单击事件异常:为什么点击按钮后只显示“调零结束”,没有显示“正在调零”?
技术百科
DDD
发布时间:2024-11-09
浏览: 次 安卓 ui 同步线程阻塞导致按钮单击事件异常
在 android 开发中,不可避免地会遇到 ui 操作。而对于涉及到耗时操作的 ui 事件,如果直接在 ui 线程中执行,就会导致线程阻塞,影响 ui 响应速度。
问题:
以下是一段按钮单击事件代码片段:
public void onclick(view view) {
if (view.getid() ==r.id.btn_o2_reset) {
log.i("onclick", "btn_o2_n2");
//提示信息
state_all_zero.settext("正在调零");
state_all_zero.invalidate();
sendcommand.delay(4000);//延时
{语句体,执行发送串口命令}
sendcommand.delay(4000);//延时
//提示信息
state_all_zer
o.settext("调零结束");
state_all_zero.invalidate();
}
}这段代码中,点击按钮后,首先显示“正在调零”提示,然后执行耗时的串口命令发送操作,最后显示“调零结束”提示。但实际运行时,却只显示了“调零结束”,没有显示“正在调零”。
原因:
这正是由于 ui 线程阻塞问题。在 android 中,ui 操作必须在主线程(即 ui 线程)中执行。而 delay 方法在执行时会阻塞主线程,导致其他 ui 操作无法进行。
解决方案:
有两种方式可以解决此问题:
-
使用 handler 发送延迟消息:
- 不在 ui 线程中调用 delay,而是使用 handler 发送一个延迟消息,在指定时间后执行代码。这样就不会阻塞 ui 线程。
-
代码示例:
handler.postdelayed(() -> { // 执行耗时的串口命令发送操作 }, 4000);
-
开启一个新线程:
- 创建一个新线程,将耗时的操作移到新线程中执行。
-
代码示例:
new Thread() { @Override public void run() { // 执行耗时的串口命令发送操作 } }.start();
# 就会
# 这段
# 涉及到
# 创建一个
# 单击
# 有两种
# 提示信息
# 移到
# ui
# 为什么
# 线程
# 事件
# 主线程
# 串口
# android
# 不可避免
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何使用Golang encoding/json解
- 如何优化Golang内存分配与GC调度_Golan
- Python安全爬虫设计_IP代理池与验证码识别策
- Win11快速助手怎么用_Win11远程协助连接教
- Win11应用商店下载慢怎么办 Win11更改DN
- Win11开始菜单打不开_修复Windows 11
- Win11怎么设置组合键快捷方式_Windows1
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- 如何在Golang中处理URL参数_Golang
- Win11无法识别耳机怎么办_解决Win11插耳机
- mac怎么打开终端_MAC终端Terminal使用
- Windows蓝屏错误0x00000018怎么处理
- 如何在Golang中使用内置函数_Golangle
- C++如何获取CPU核心数?(std::threa
- php打包exe后无法读取环境变量_变量配置方法【
- Linux如何安装Golang环境_Linux下G
- 如何在Golang中实现RPC异步返回_Golan
- php删除数据怎么软删除_添加is_del字段标记
- c# F# 的 MailboxProcessor
- Win11怎么设置任务栏对齐方式_Windows1
- php嵌入式需要什么环境_搭建php+linux嵌
- Win11怎么查看硬盘型号_Windows 11检
- Win11怎么开启剪贴板历史记录_Windows1
- Win11怎么设置多显示器任务栏 Win11扩展任
- Win11如何设置系统声音_Win11系统声音调整
- Windows服务启动类型恢复方法_错误修改导致的
- Windows家庭版如何开启组策略(gpedit.
- Windows Defender扫描失败怎么办_安
- Win11怎么压缩文件 Win11自带压缩解压功能
- c++20的std::format怎么用 比pri
- 短链接怎么自定义还原php_修改解码规则适配需求【
- 微信里的php文件怎么变mp4_微信接收php转m
- 如何在Golang中引入测试模块_Golang测试
- 如何在Golang中实现服务熔断与限流_Golan
- 电脑无法识别U盘怎么办 Windows磁盘管理与驱
- Mac的“调度中心”与“空间”怎么用_Mac多桌面
- Win10怎样卸载自带Edge_Win10卸载Ed
- Win11怎么设置开机密码_Windows11账户
- Windows 11如何开启文件夹加密(EFS)_
- Windows电脑如何截屏?(四种快捷方法)
- Win11怎么设置指纹解锁 Win11笔记本录入指
- Win11怎么关闭键盘按键音_Win11禁用打字声
- Windows怎样关闭桌面弹窗广告_Windows
- 如何使用Golang进行HTTP服务性能测试_测量
- PHP的Workerman对架构扩展有啥帮助_应用
- php修改数据怎么改富文本_update更新htm
- php订单日志怎么按状态筛选_php筛选不同状态订
- Win11 explorer.exe频繁崩溃_修复
- php查询数据怎么分组_groupby分组查询配合
- Python路径拼接规范_跨平台处理说明【指导】

o.settext("调零结束");
state_all_zero.invalidate();
}
}
QQ客服