当前位置: 首页 > 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)}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • uniapp开发安卓app--安卓低版本(4.4)不显示echarts图表问题解决思路
  • DataX
  • ES6 -- 总结 03
  • Linux网络编程——C/C++Web服务器(二):IO多路复用select/poll/epoll实现服务器监听多客户端事件
  • Java 使用 POI 导出Excel,实现单元格内容为下拉选项
  • 《计算机操作系统》(第4版)第10章 多处理机操作系统 复习笔记
  • Elasticsearch对象映射
  • 神经网络算法 - 一文搞懂Back Propagation(反向传播)
  • js去重的方法
  • Qt使用 QSetting 对 ini 配置文件进行操作
  • 游戏app激励视频广告预加载位置,最大化广告收益
  • 深入理解 CSS Flex 布局
  • git 项目可以拉取提交不了
  • Linux:文件操作
  • EV代码签名证书——消除软件下载时的安全警告
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [笔记] php常见简单功能及函数
  • 【译】理解JavaScript:new 关键字
  • happypack两次报错的问题
  • JavaScript DOM 10 - 滚动
  • java小心机(3)| 浅析finalize()
  • LeetCode29.两数相除 JavaScript
  • rc-form之最单纯情况
  • 读懂package.json -- 依赖管理
  • 解析带emoji和链接的聊天系统消息
  • 如何解决微信端直接跳WAP端
  • 微信开源mars源码分析1—上层samples分析
  • 小程序button引导用户授权
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​TypeScript都不会用,也敢说会前端?
  • # .NET Framework中使用命名管道进行进程间通信
  • # 数论-逆元
  • #pragma once与条件编译
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (3)nginx 配置(nginx.conf)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十一)手动添加用户和文件的特殊权限
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (一)UDP基本编程步骤
  • (译)2019年前端性能优化清单 — 下篇
  • (转)3D模板阴影原理
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net 验证控件和javaScript的冲突问题
  • .NET 直连SAP HANA数据库
  • .NET导入Excel数据
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • ::before和::after 常见的用法
  • ??在JSP中,java和JavaScript如何交互?