告别ANR!Android中六种安全更新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);
好的线程管理就像优秀的交通管制,让数据在正确的时间走正确的车道!现在就去优化你的代码吧~
热门专题
热门推荐
清明节假期期间,A 股和港股休市,但比特币行情永不停歇。 4月6日,当多数市场还在假期中沉睡时,比特币已经悄然启动。价格从亚洲早盘的低点67400美元出发,一路向上试探,盘中最高涨破70300美元,不仅刷新了3月26日以来的高位,较日内低点的涨幅也超过了4%。以太坊的表现同样不俗,从2050美元附近
4月5日消息,日前,REDMI K90至尊版通过3C认证,预计将于本月发布。今日,小米中国区市场部总经理魏思琪用小米新机发布微博,不出意外,这正是即将登场的REDMI K90至尊版,这将是小米首款配
WPS演示中图表不随数据更新时,可通过四种方法实现自动同步:一、用OFFSET+COUNTA定义动态名称绑定图表;二、用组合框控件联动VLOOKUP提取数据;三、用数据透视图配合切
聚焦数字技术,释放创新动能。为集中展示静安区区块链技术从“实验室”走向“应用场”的丰硕成果,挖掘一批可复制、可推广的行业解决方案,加速构建区块链产业生态闭环,静安区数据局特推出“静安区区块链创新应用
太空中的马桶堵了,边飞边修还能勉强用。但中东被点燃的火药桶,美国怎么来扑灭?靠一再延期的“最后通牒”?还是靠无底线的轰炸?2300万美元的马桶美国航空航天局4名宇航员1日搭乘“猎户座”飞船升空,执行





