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

Android中几种线程交互方式

目录

    • 0 前言
    • 1 子线程与主线程的Handler通信
    • 2 View.post
    • 3.View.postDelay
    • 4.runOnUiThread
    • 5 AsyncTask
    • 6 子线程之间通信
    • 7 基类

0 前言

在Android中ui线程就是主线程。
这里简述复习一下传统的主线程和子线程通信的方式。
在此之前先看看ActivityManager,类似程序管理器,提供活动、服务和包含进程的信息,下面调试会用到。
ActivityManager官方文档
主界面如下:

在这里插入图片描述

1 子线程与主线程的Handler通信

主线程默认自带looper。找到如线程的handler就行。


private val handler = object : Handler() {override fun handleMessage(msg: Message) {super.handleMessage(msg)// 回到主线程(UI线程),处理UIgetProcessInfo(true)when (msg.what) {0 -> {Toast.makeText(this@HandlerTestActivity, "收到子线程发送的消息: ${msg.obj}", Toast.LENGTH_LONG).show()}}           }}
Thread{getProcessInfo(false)val msg = Message()msg.what = 0msg.obj = "子线程id是: ${Thread.currentThread().name}"handler.sendMessage(msg)getProcessInfo(false)     
}.start()

2 View.post

Thread{getProcessInfo(false)tv_1.post {getProcessInfo(true)}
}.start()

3.View.postDelay

Thread{getProcessInfo(false)tv_1.postDelayed({getProcessInfo(true)
},5000)}.start()

4.runOnUiThread

Thread {// 子线程(工作线程),处理耗时操作getProcessInfo(false)try {Thread.sleep(6000)}catch (e: Exception){println(e)}runOnUiThread {// 回到主线程(UI线程),处理UIgetProcessInfo(true)}}.start()}

5 AsyncTask

object : MyAsyncTask(){
}.execute()
 open inner class MyAsyncTask : AsyncTask<String, Void, String>() {override fun doInBackground(vararg params: String): String {// 子线程(工作线程),处理耗时操作getProcessInfo(false)return ""}override fun onPostExecute(result: String) {super.onPostExecute(result)// 回到主线程(UI线程),处理UIgetProcessInfo(true)}}

6 子线程之间通信

class SonTestActivity : BaseActivity() {private lateinit var handler: Handleroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_son_test)// 创建并启动子线程一Thread(ThreadA()).start()// 等待线程A准备好Thread.sleep(1000)// 创建并启动子线程二Thread(ThreadB()).start()}inner class ThreadA : Runnable {override fun run() {Looper.prepare()handler = object : Handler() {override fun handleMessage(msg: Message) {super.handleMessage(msg)when (msg.what) {1 -> {Log.e("线程A", "线程B发过来消息了--${msg.obj}")}}}}Looper.loop()}}// 子线程二inner class ThreadB : Runnable {override fun run() {val mess = Message.obtain()mess.what = 1mess.obj = "线程B${System.currentTimeMillis()}"handler.sendMessage(mess)}}
}

效果:
在这里插入图片描述

7 基类

/*** @Author: tian7* @Email: 253493510@qq.com* @Date: on 2024/8/22: 12: 19* @Description: 描述*/
open class BaseActivity: AppCompatActivity() {private lateinit var manager: ActivityManageroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager}fun getProcessInfo(isShow: Boolean){val processList = manager.runningAppProcessesval s1 = StringBuilder()for (process in processList){s1.append("当前进程id").append(process.pid).append("\n当前线程id").append(Thread.currentThread().name).append("\n当前线程状态").append(Thread.currentThread().state).append("\n")}if (isShow){dLog(s1.toString())}}fun dLog(msg: String){Log.d("tian",msg)}
}

http://www.mrgr.cn/news/10292.html

相关文章:

  • Deep-Live-Cam启动
  • UV LED供电为什么要选择使用恒流驱动电源
  • Tomcat 优化
  • git如何进行版本回退
  • 8.21 学习playbook-roles,脚本创建数据库和表,mycat读写分离
  • Tomcat的基本使用
  • 如何给pdf加水印?这五个方法,一键批量添加/移除水印!
  • Codeforces Round 968 (Div. 2 ABCD1D2题) 视频讲解
  • netengine ar1000v
  • 银河麒麟V10+qt5,12.11编译mysql驱动连接OceanBase数据库
  • Spark-第六周
  • GAMES104:09高级动画技术:动画树、IK和表情动画-学习笔记
  • 应用实例 | Simufact 增材制造工艺仿真助力保时捷薄壁件打印
  • 设计模式(一):单例模式
  • SQL Server数据库 创建表,和表的增删改查
  • 高性能 Web 服务器:让网页瞬间绽放的魔法引擎(下)
  • 数学建模学习
  • 【Node】【3】回调函数
  • 如何本地搭建 Whisper 语音识别模型?一文解决
  • 【Python】机器学习中的 K-均值聚类算法及其优缺点