【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )
文章目录
- 一、判定当前线程是否是主线程
- 二、子线程中执行主线程方法
- 三、主线程中执行子线程方法
一、判定当前线程是否是主线程
在 Android 中 , 如果要判定当前线程是否是主线程 , 可以使用如下方法进行判定 ;
调用 Looper
的 getMainLooper()
静态方法获取 mainLooper , 调用 Looper
的 myLooper()
静态方法获取 myLooper , 对比二者是否相等 ;
Looper.getMainLooper()
方法获取的总是本进程的主线程 Looper
对象 ;
Looper.myLooper()
方法获取的是当前 Looper 线程的 Looper
对象 ,
如果当前线程是主线程 , 那么这两个 Looper
对象是相同的 ;
// 判断当前线程是否是主线程// 获取 mainLooper 与 myLooper 进行比较 , 如果一致 , 说明该线程是主线程boolean isMainThread = false;// 下面的情况下 , 线程是主线程if (Looper.getMainLooper() == Looper.myLooper()) {isMainThread = true;}
二、子线程中执行主线程方法
获取主线程的 Looper
, 通过 Looper
创建对应的 Handler
, 然后通过该 Handler
向其发送 Runnable 任务即可 ;
一个线程只能有一个 Looper
和 MessageQueue
, 但是可以有多个 Handler
;
其中 MessageQueue
封装在 Handler
中 ;
// 将订阅方法放到主线程执行// 获取主线程 Looper , 并通过 Looper 创建 HandlerHandler handler = new Handler(Looper.getMainLooper());// 在主线程中执行订阅方法handler.post(new Runnable() {@Overridepublic void run() {invokeMethod(subscription, event);}});
三、主线程中执行子线程方法
可以直接创建 Thread
线程并执行 ;
也可以创建 ExecutorService
线程池 , 执行线程任务 ;
/*** 线程池*/private final ExecutorService executorService = Executors.newCachedThreadPool();// 在线程池中执行方法executorService.execute(new Runnable() {@Overridepublic void run() {invokeMethod(subscription, event);}});
【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )相关推荐
- 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )
文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...
- Windows进程与线程学习笔记(五)—— 模拟线程切换
Windows进程与线程学习笔记(五)-- 模拟线程切换 ThreadSwitch代码分析 ThreadSwitch.cpp ThreadCore.h ThreadCore.cpp 总结 Thread ...
- 线程切换是如何给 CPU 洗脑的?
计算机系统中有很多程序员习以为常但又十分神秘的存在:函数调用.系统调用.进程切换.线程切换以及中断处理. 函数调用能让程序员提高代码可复用性,系统调用能让程序员向操作系统发起请求,进程线程切换让多任务 ...
- 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )
文章目录 一.线程池中的 Worker ( 工作者 ) 二.线程池中的工作流程 runWorker 三.线程池任务队列中获取任务 getTask 在博客 [Android 异步操作]线程池 ( 线程池 ...
- 【Android 异步操作】线程池 ( 线程池 reject 拒绝任务 | 线程池 addWorker 添加任务 )
文章目录 一.线程池 reject 拒绝任务 二.线程池 addWorker 添加任务 在上一篇博客 [Android 异步操作]线程池 ( 线程池 execute 方法源码解析 ) 中 , 讲解 线 ...
- 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )
文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...
- [Android] 任意时刻从子线程切换到主线程的实现
[Android] 任意时刻从子线程切换到主线程的实现 - Android移动开发技术文章_手机开发 - 红黑联盟 转载于:https://www.cnblogs.com/melons/p/57919 ...
- android rxjava 多线程,你真的了解RxJava的线程切换吗?
使用RxJava可以轻松地实现线程切换,所以在Android中常被用来替代AsyncTask.Handler等原生工具类.使用起来虽然简单,但如果不了解其背后的基本原理,很可能因为使用不当而写出bug ...
- 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...
最新文章
- 一篇文章带你了解https是如何做到客户端与服务端之间安全通信
- C#获取枚举描述代码
- linux操作这样用视频,Linux下使用mencoder对视频进行操作
- legend---十二、js中的js语句和函数和ready函数的关系是什么
- CentOS6.5的安装及忘记root密码的措施
- C++ 文件读写操作01
- VMware虚拟机下安装Ubuntu16.04镜像完整教程
- Word文档处理控件TX Text Control .NET for WPF
- java array使用_Java_ArrayLit详细用法
- STM32CubeMX+Keil裸机代码风格(2)
- Make Menuconfig详解 (配置内核选择)
- 简易呼吸灯c语言程序,51单片机(呼吸灯)C语言版.docx
- 计算机求百钱买百鸡问题采用,5.5 百钱买百鸡问题
- Linux 运维职业困惑?给你史上最全互联网 Linux 工作规划!
- 基于Element组件下动态生成多级表头以及数据
- 2023第五届山东国际中医药产业展会,中医养生展,中医文化展
- DIY Gamebuino Classic游戏机
- cesium 添加广告牌
- JavaScript判断输入值是否为素数
- springboot整合全文搜索引擎Elasticsearch | Spring Boot 28
热门文章
- cms系统与dreamweaver建站
- CSS定位布局display/float/position属性之间的关系/区别和如何使用取值行为机制
- 三. python面向对象(私有属性和私有方法 私有静态方法 私有类方法)
- [转]Docker基础-使用Dockerfile创建镜像
- Firebird日期时间操作
- Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
- 数据备份基础之备份类型
- FileStream 和StreamWriter 一起用时
- Android之布局RelativeLayout
- Linux Bash变量-数值运算与运算符