文章目录

  • 一、判定当前线程是否是主线程
  • 二、子线程中执行主线程方法
  • 三、主线程中执行子线程方法

一、判定当前线程是否是主线程


在 Android 中 , 如果要判定当前线程是否是主线程 , 可以使用如下方法进行判定 ;

调用 LoopergetMainLooper() 静态方法获取 mainLooper , 调用 LoopermyLooper() 静态方法获取 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 任务即可 ;

一个线程只能有一个 LooperMessageQueue , 但是可以有多个 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 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )相关推荐

  1. 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )

    文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...

  2. Windows进程与线程学习笔记(五)—— 模拟线程切换

    Windows进程与线程学习笔记(五)-- 模拟线程切换 ThreadSwitch代码分析 ThreadSwitch.cpp ThreadCore.h ThreadCore.cpp 总结 Thread ...

  3. 线程切换是如何给 CPU 洗脑的?

    计算机系统中有很多程序员习以为常但又十分神秘的存在:函数调用.系统调用.进程切换.线程切换以及中断处理. 函数调用能让程序员提高代码可复用性,系统调用能让程序员向操作系统发起请求,进程线程切换让多任务 ...

  4. 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )

    文章目录 一.线程池中的 Worker ( 工作者 ) 二.线程池中的工作流程 runWorker 三.线程池任务队列中获取任务 getTask 在博客 [Android 异步操作]线程池 ( 线程池 ...

  5. 【Android 异步操作】线程池 ( 线程池 reject 拒绝任务 | 线程池 addWorker 添加任务 )

    文章目录 一.线程池 reject 拒绝任务 二.线程池 addWorker 添加任务 在上一篇博客 [Android 异步操作]线程池 ( 线程池 execute 方法源码解析 ) 中 , 讲解 线 ...

  6. 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )

    文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...

  7. [Android] 任意时刻从子线程切换到主线程的实现

    [Android] 任意时刻从子线程切换到主线程的实现 - Android移动开发技术文章_手机开发 - 红黑联盟 转载于:https://www.cnblogs.com/melons/p/57919 ...

  8. android rxjava 多线程,你真的了解RxJava的线程切换吗?

    使用RxJava可以轻松地实现线程切换,所以在Android中常被用来替代AsyncTask.Handler等原生工具类.使用起来虽然简单,但如果不了解其背后的基本原理,很可能因为使用不当而写出bug ...

  9. 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )

    文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...

最新文章

  1. 一篇文章带你了解https是如何做到客户端与服务端之间安全通信
  2. C#获取枚举描述代码
  3. linux操作这样用视频,Linux下使用mencoder对视频进行操作
  4. legend---十二、js中的js语句和函数和ready函数的关系是什么
  5. CentOS6.5的安装及忘记root密码的措施
  6. C++ 文件读写操作01
  7. VMware虚拟机下安装Ubuntu16.04镜像完整教程
  8. Word文档处理控件TX Text Control .NET for WPF
  9. java array使用_Java_ArrayLit详细用法
  10. STM32CubeMX+Keil裸机代码风格(2)
  11. Make Menuconfig详解 (配置内核选择)
  12. 简易呼吸灯c语言程序,51单片机(呼吸灯)C语言版.docx
  13. 计算机求百钱买百鸡问题采用,5.5 百钱买百鸡问题
  14. Linux 运维职业困惑?给你史上最全互联网 Linux 工作规划!
  15. 基于Element组件下动态生成多级表头以及数据
  16. 2023第五届山东国际中医药产业展会,中医养生展,中医文化展
  17. DIY Gamebuino Classic游戏机
  18. cesium 添加广告牌
  19. JavaScript判断输入值是否为素数
  20. springboot整合全文搜索引擎Elasticsearch | Spring Boot 28

热门文章

  1. cms系统与dreamweaver建站
  2. CSS定位布局display/float/position属性之间的关系/区别和如何使用取值行为机制
  3. 三. python面向对象(私有属性和私有方法 私有静态方法 私有类方法)
  4. [转]Docker基础-使用Dockerfile创建镜像
  5. Firebird日期时间操作
  6. Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
  7. 数据备份基础之备份类型
  8. FileStream 和StreamWriter 一起用时
  9. Android之布局RelativeLayout
  10. Linux Bash变量-数值运算与运算符