35人参与 • 2025-07-24 • Android
在 android 中,ui 操作必须在主线程中进行,不能直接在子线程中更新 ui。今天介绍两种在子线程切换回主线程的方法。
runonuithread()
和 handler.post()
都可以用于切换到 主线程(ui 线程) 执行任务,主要用于 更新 ui。但它们在使用方式、作用范围、底层实现上有所不同。
runonuithread()
是 activity
的一个方法,它可以让任务在 主线程(ui 线程) 执行。适用于 在 activity
内部 从子线程切换到主线程 以更新 ui。
用法:
runonuithread(new runnable() { @override public void run() { textview.settext("更新 ui"); } });
lambda 写法:
runonuithread(() -> textview.settext("更新 ui"));
底层原理:
runonuithread()
的实现本质上 使用了 handler.post()
,它会获取 activity
绑定的 looper
,然后将任务投递到 主线程消息队列。
适用场景
activity
里使用,不能在 service
、broadcastreceiver
等组件中用。oncreate()
、网络请求回调、异步任务完成后 更新 textview、button 等 ui 组件。完整的代码:实现的效果很简单,2秒后在主界面更新ui,显示 "ui 更新成功!"
public class mainactivity extends appcompatactivity { private textview textview; @suppresslint("missinginflatedid") @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main9); textview = findviewbyid(r.id.textview); // 在子线程中执行耗时操作 new thread(new runnable() { @override public void run() { try { thread.sleep(2000); // 模拟网络请求或其他耗时任务 } catch (interruptedexception e) { e.printstacktrace(); } // 切换到主线程更新 ui runonuithread(new runnable() { @override public void run() { textview.settext("ui 更新成功!"); } }); } }).start(); } }
handler.post()
通过 handler
将任务投递到指定的线程,一般用于 从子线程切换到主线程 处理 ui 更新,也可以用于子线程间通信。
handler handler = new handler(looper.getmainlooper()); handler.post(() -> textview.settext("更新 ui"));
底层原理
handler
通过 messagequeue
投递任务,looper
取出并执行。post()
发生在主线程,它也会把任务加入消息队列,可能稍微延迟执行。适用场景
activity
、service
、fragment
、broadcastreceiver
)。postdelayed()
)。完整代码,实现的效果和上面runonuithread()是一样的。2秒延迟后,主界面显示"数据加载完成"
import android.os.handler; import android.os.looper; public class mainactivity extends appcompatactivity { private textview textview; @suppresslint("missinginflatedid") @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main9); textview = findviewbyid(r.id.textview); handler handler = new handler(looper.getmainlooper()); new thread(() -> { try { thread.sleep(2000); // 模拟网络请求 } catch (interruptedexception e) { e.printstacktrace(); } handler.post(() -> textview.settext("数据加载完成")); }).start(); } }
到此这篇关于android studio切换主线程的两种方式详解的文章就介绍到这了,更多相关android studio切换主线程内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论