游乐游手机版
首页/科技数码/文章详情

告别ANR!Android中六种安全更新UI的方式

时间:2025-12-15 20:51
想象你在另一个城市(子线程)买了礼物,想送给女朋友(UI线程)。直接扔过去会砸伤人(崩溃),必须通过快递站(主线程通信机制)。 想象你在另一个城市(子线程)买了礼物,想送给女朋友(UI线程)。直接扔

想象你在另一个城市(子线程)买了礼物,想送给女朋友(UI线程)。直接扔过去会砸伤人(崩溃),必须通过快递站(主线程通信机制)。

想象你在另一个城市(子线程)买了礼物,想送给女朋友(UI线程)。直接扔过去会砸伤人(崩溃),必须通过快递站(主线程通信机制)。以下是安全送礼指南:

方案1:最新快递站-runOnUiThread

适用场景:在Activity/Fragment中快速传递

// 子线程工作new Thread(() -> { String message = fetchMsgFromServer(); // 最新指定快递点 runOnUiThread(() -> { textView.setText(message); // 安全送达 });}).start();

优势:

• 系统自带,随用随取• 自动识别当前Activity生命周期

方案2:任意代收点-View.post

适用场景:在任何能拿到View的地方

// 在任意View可达的地方fun updateProgress(progress: Int) { Thread { val current = calculateProgress() // 随便找个View当快递柜 progressBar.post { progressBar.progress = current } }.start()}

隐藏技巧:

• 即使View还没显示也能寄存消息

• 支持延迟投递:view.postDelayed({...}, 1000)

方案3:老牌物流-Handler

适用场景:需要精准控制消息队列

// 创建主线程HandlerHandler mainHandler=new Handler(Looper.getMainLooper());void showNotification(String message) { executorService.execute(() -> { prepareNotification(message); // 精准派送 mainHandler.post(() -> { notificationView.display(message); }); });}

避坑指南:

• 记得在onDestroy时调用mHandler.removeCallbacksAndMessages(null)

• 用postDelayed实现定时刷新:mHandler.postDelayed(updateTask, 5000)

方案4:智能管家-LiveData

适用场景:MVVM架构下的数据驱动UI

// ViewModel中private val _newsLiveData = MutableLiveData>()val newsLiveData: LiveData> = _newsLiveDatafun loadNews() { viewModelScope.launch(Dispatchers.IO) { val news = repository.fetchNews() _newsLiveData.postValue(news) // 自动切到主线程 }}// Activity中newsViewModel.newsLiveData.observe(this) { news -> adapter.submitList(news) // 安全更新RecyclerView}

优势对比:

方案5:闪电侠-协程

适用场景:Kotlin项目中的异步处理

fun loadComments() { lifecycleScope.launch { val comments = withContext(Dispatchers.IO) { api.getComments(postId) } // 自动切回主线程 binding.commentList.adapter = CommentAdapter(comments) }}

性能对比:

• 传统线程:每次new Thread约消耗1MB内存

• 协程:轻量级,1KB级内存消耗

方案6:万能工-RxJava

适用场景:复杂异步流处理

Observable.fromCallable(() -> db.queryUnreadMsg()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(messages -> { badgeView.updateCount(messages.size); });

高阶用法:

// 合并多个数据源Observable.merge(networkData, localData) .filter(msg -> !msg.isDeleted) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::updateUI);

好的线程管理就像优秀的交通管制,让数据在正确的时间走正确的车道!现在就去优化你的代码吧~

来源:https://www.51cto.com/article/814557.html
上一篇索菲·特纳出演古墓丽影女主,观众热议不断 下一篇空洞骑士:丝之歌上线首日服务器崩溃,玩家社区热议自嘲
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
LiblibAI云端WebUI降低AI绘画部署门槛
科技数码 · 2026-07-02

LiblibAI云端WebUI降低AI绘画部署门槛

LiblibAI在线WebUI的核心优势在于——只需通过浏览器即可流畅运行Stable Diffusion,无需自行搭建本地环境。云端直接处理运算,模型即选即试,大幅降低了AI绘画的创作门槛。对于轻量创作和模型快速测试来说,体验相当顺畅,但用户仍需重视数据隐私保护和版权合规等问题。 过去使用Stab

微软因用户不安叫停Edge浏览器AI历史搜索功能
科技数码 · 2026-07-02

微软因用户不安叫停Edge浏览器AI历史搜索功能

微软紧急暂停Edge浏览器AI历史搜索功能,该功能因被用户吐槽“令人不安”而暂缓部署。尽管微软强调所有AI处理在设备端完成且数据不上传云端,但用户仍不信任。此举与WindowsK2计划减少功能堆砌的理念一致。

红魔游戏平板5 Pro发布 4999元起售将登陆全球市场
科技数码 · 2026-07-02

红魔游戏平板5 Pro发布 4999元起售将登陆全球市场

【CNMO科技消息】近日,红魔游戏平板5 Pro正式发布。这款平板从定位上就明确瞄准“极致游戏”体验,外观方面带来了一个重磅亮点——首次引入RGB水冷散热系统,背部那条可视化的水路通道,配合纯平透明背板设计,核心配置信息一览无余,科技感十足。 图源网络 屏幕方面同样表现突出。一块9 06英寸OLED

杭州全国首所机器人学校首批30台机器人入学
科技数码 · 2026-07-02

杭州全国首所机器人学校首批30台机器人入学

30台机器人整齐列队,有的刚从生产线卸下,机械零件还带着崭新的“工业气息”;有的已搭载运动控制模块,能稳健地小跑、跳跃几下。它们来自不同制造工厂,外形与功能各有千秋,但此刻都拥有了同一个身份——杭州机器人学校的第一批入学新生。 6月30日,杭州经信正式发布:由浙江大学机器人研究院、浙江省质量科学研究

美国计划发射航天器托举天文卫星
科技数码 · 2026-07-02

美国计划发射航天器托举天文卫星

就在最近,NASA公布了一项非常果断的干预计划——他们定于6月30日实施一次“卫星维修任务”,派遣一台名为“连接”号的机器人服务卫星,为一颗超期服役的天文卫星延长运行寿命。这颗卫星是“尼尔·格雷尔斯·斯威夫特天文台”,其轨道高度正在不断衰减,如果不进行干预,今年年底前很可能会坠入地球大气层并烧毁。