当前位置: 首页 > news >正文

Android 开发 - 子线程到主线程的通信方式(使用 Handler、使用 View 的 post 方法、使用 Activity 的 runOnUiThread 方法等)

一、使用 Handler

TextViewtvContent=findViewById(R.id.tv_content);Handlerhandler=newHandler(Looper.getMainLooper()){@OverridepublicvoidhandleMessage(@NonNullMessagemsg){tvContent.setText("收到消息:"+msg.what);}};newThread(()->{try{Thread.sleep(3*1000);}catch(InterruptedExceptione){e.printStackTrace();}Messagemsg=Message.obtain();msg.what=100;handler.sendMessage(msg);try{Thread.sleep(3*1000);}catch(InterruptedExceptione){e.printStackTrace();}handler.post(()->{tvContent.setText("更新 UI");});}).start();

二、使用 View 的 post 方法

TextViewtvContent=findViewById(R.id.tv_content);newThread(()->{try{Thread.sleep(3*1000);}catch(InterruptedExceptione){e.printStackTrace();}tvContent.post(()->{tvContent.setText("更新 UI");});}).start();

三、使用 Activity 的 runOnUiThread 方法

TextViewtvContent=findViewById(R.id.tv_content);newThread(()->{try{Thread.sleep(3*1000);}catch(InterruptedExceptione){e.printStackTrace();}runOnUiThread(()->{tvContent.setText("更新 UI");});}).start();

四、使用 AsyncTask

TextViewtvContent=findViewById(R.id.tv_content);classMyTaskextendsAsyncTask<String,Integer,String>{@OverrideprotectedStringdoInBackground(String...strings){Stringinput=strings[0];try{Thread.sleep(3*1000);}catch(InterruptedExceptione){e.printStackTrace();}return"处理 【"+input+"】 完成";}@OverrideprotectedvoidonPostExecute(Stringstring){tvContent.setText(string);}}newMyTask().execute("task");

五、使用 LiveData

TextViewtvContent=findViewById(R.id.tv_content);MutableLiveData<String>content=newMutableLiveData<>();content.observe(this,s->{tvContent.setText(s);});newThread(()->{try{Thread.sleep(3*1000);}catch(InterruptedExceptione){e.printStackTrace();}content.postValue("更新 UI");}).start();

六、使用 EventBus

implementation'org.greenrobot:eventbus:3.3.1'
publicclassEventBusTestActivityextendsAppCompatActivity{privateTextViewtvContent;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_event_bus_test);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});tvContent=findViewById(R.id.tv_content);newThread(()->{try{Thread.sleep(3*1000);}catch(InterruptedExceptione){e.printStackTrace();}EventBus.getDefault().post("hello event bus");}).start();}@OverrideprotectedvoidonStart(){super.onStart();EventBus.getDefault().register(this);}@OverrideprotectedvoidonStop(){super.onStop();EventBus.getDefault().unregister(this);}@Subscribe(threadMode=ThreadMode.MAIN)publicvoidonMessage(Stringmessage){tvContent.setText(message);}}

七、使用 RxJava

implementation'io.reactivex.rxjava3:rxjava:3.1.8'implementation'io.reactivex.rxjava3:rxandroid:3.0.2'
publicclassRxJavaTestActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_rx_java_test);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});TextViewtvContent=findViewById(R.id.tv_content);Observable.create((ObservableEmitter<String>emitter)->{TimeUnit.SECONDS.sleep(3);emitter.onNext("test content");}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(data->{tvContent.setText(data);});}}

八、使用 BroadcastReceiver

publicclassBroadcastReceiverTestActivityextendsAppCompatActivity{privateTextViewtvContent;classMyBroadcastReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringmessage=intent.getStringExtra("message");tvContent.setText(message);}}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_broadcast_receiver_test);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});tvContent=findViewById(R.id.tv_content);MyBroadcastReceivermyBroadcastReceiver=newMyBroadcastReceiver();IntentFilterintentFilter=newIntentFilter();intentFilter.addAction(MyBroadcastReceiver.class.getSimpleName());registerReceiver(myBroadcastReceiver,intentFilter);newThread(()->{try{Thread.sleep(3*1000);}catch(InterruptedExceptione){e.printStackTrace();}Intentintent=newIntent(MyBroadcastReceiver.class.getSimpleName());intent.putExtra("message","test content");sendBroadcast(intent);}).start();}}

九、使用协程

classCoroutinesTestActivity:AppCompatActivity(){override funonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_coroutines_test)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)){v,insets->val systemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom)insets}val tvContent=findViewById<TextView>(R.id.tv_content)CoroutineScope(Dispatchers.IO).launch{delay(3000)val message="test content"withContext(Dispatchers.Main){tvContent.text=message}}}}
http://www.jsqmd.com/news/367753/

相关文章:

  • 【计算机毕业设计案例】基于Java+Vue+SpringBoot足球俱乐部管理系统的设计与实现基于springboot的足球俱乐部青训管理系统的设计与实现(程序+文档+讲解+定制)
  • 【SPIE、双刊号ISSNISBN、五届稳定EI检索】第六届数字信号与计算机通信国际学术会议(DSCC 2026)
  • 云存储集成:Python 驱动企微外部群多媒体资源的自动化分发
  • 如何评估企业的垂直整合价值
  • 【计算机毕业设计案例】基于springboot的农村康养院敬老院平台的设计与实现(程序+文档+讲解+定制)
  • Android Jetpack Compose - Switch(切换)、Slider(滑块)、RangeSlider(范围滑块)
  • 【预测模型】基于深度置信网络DBN锂电池寿命预测附Matlab代码
  • 一键部署科研环境:天翼云息壤科研助手解放科研生产力
  • 为什么需要RAG?推荐一个从零搭建RAG的项目,含教学视频
  • 2026/2/10
  • 刷机过程之安装FastBoot驱动 解决fastboot waiting for any device问题
  • Windows 性能分析器WPT深度解析
  • 【预测模型】沙丘猫算法+哈里斯鹰+鲸鱼+黏菌算法+猎食者算法优化OS-ELM模型的锂电池SOH预测附Matlab代码
  • Java毕设项目推荐-基于Java的足球俱乐部训练中心管理系统基于springboot的足球俱乐部青训管理系统的设计与实现【附源码+文档,调试定制服务】
  • cpu的fetch/prefetch
  • 拯救大模型“幻觉”?Python_RAG九大架构全解析!
  • 别盲目跟随!家梁带你看清AI背后的操控与谎言
  • 网络安全学习路线图
  • 【重磅整理】2025计算机专业就业方向全景图:薪资、技能与前景深度剖析
  • 计算机Java毕设实战-基于springboot的农村康养院敬老院平台的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【预测模型】天牛须算法优化BP神经网络的电力负荷预测附matlab代码
  • Android 切换应用语言 - 指南
  • 计算机Java毕设实战-基于SpringBoot+Vue+MySQL的足球俱乐部管理基于springboot的足球俱乐部青训管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 家梁眼中的AI乱象:惊讶、哭笑不得、还有点恐怖
  • SharePoint Online 嵌入 Power BI 报表
  • 计算机毕业设计springboot宠物托运服务系统 SpringBoot萌宠出行预约管理系统 SpringBoot爱宠远程护送信息平台
  • 【课程设计/毕业设计】基于Web足球青训俱乐部管理后台系统开发基于springboot的足球俱乐部青训管理系统的设计与实现【附源码、数据库、万字文档】
  • 独立开发配置
  • CAN FD总线协议深度解析:技术特点与应用优势
  • 【课程设计/毕业设计】基于springboot的农村康养院敬老院平台的设计与实现【附源码、数据库、万字文档】