Andriod 子线程更新UI
Andoird是不允许直接在子线程中更新UI的。原因是子线程中更新UI会引起线程不安全问题,导致界面卡顿掉帧。
在子线程中run方法中,通过handler.post或其他方式将更新UI的任务消息发送到UI线程,由UI线程更新UI。
Thread和Runnable的区别
- Thread代表线程类。start()开启子线程,执行体为run()方法
- Runnable只是一个接口,直接调用其run()方法,并不会开启子线程
下面介绍几种子线程更新UI的方法
方式一:Handler和Message
常规使用方法
子线程run()方法里handle.sendmessage发消息
主线程handler.handleMessage更新ui
Handler handler = new Handler(){ @Override public void handleMessage(Message msg){ String s = String.valueOf(msg.what); TextView tv = (TextView)findViewById(R.id.textView); tv.setText(tv.getText() + ” ” + s); } }; Runnable run = new Runnable(){ @Override public void run(){ Random r = new Random(); int rnum = r.nextInt((100 – 10) + 1) + 10; handler.sendEmptyMessage(rnum); handler.postDelayed(run, 5000); i++; if (i==5){ handler.removeCallbacks(run); } } };
方式二:在子线程中调用view.post
myView.post(new Runnable() { @Override public void run() { // 更新UI myView.setText(“更新UI”); }});
方式三:在子线程中调用runOnUIThread
在子线程中直接调用Activity.runOnUiThread(Runnable action)方法
runOnUiThread(new Runnable() { @Override public void run() { // 更新UI的操作 } });
方式四:Handler.post()方法
追踪源码发现,这几种方法也是通过Handler+Message来实现的。一般简单的更新UI推荐使用方法二和方法三
注意
Runable接口run()方法可理解为一个回调,配合Thread.start()才是开启子线程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)