Android开发中, 有时需要判断当前线程到底是主线程, 还是子线程, 例如: 我们在自定义View时, 想要让View重绘, 需要先判断当前线程到底是不是主线程, 然后根据判断结果来决定到底是调用 invalidate() 还是 postInvalidate() 方法. 如果当前是主线程, 就调用 invalidate() 方法; 而如果当前是子线程, 就调用 postInvalidate() 方法, 注意: 子线程中不能调用 invalidate() 方法, 否则就会报异常, 提示我们不能在子线程中更新UI。

那么, 我们如何判断当前线程到底是主线程, 还是子线程呢? 答案是: 可以借助于 Looper. 代码如下:

public boolean isMainThread() {
return Looper.getMainLooper() == Looper.myLooper();
}

或者

public boolean isMainThread() {
return Looper.getMainLooper().getThread() == Thread.currentThread();
}

或者

public boolean isMainThread() {
return Looper.getMainLooper().getThread().getId() == Thread.currentThread().getId();
}

Android判断当前是否在主线程的更多相关文章

  1. Android判断当前线程是否是主线程的方法

    开发过程中有时候会在Thread类中执行某些操作,有些操作会由于Android版本的不同,尤其是低版本而Crash,因此必要的时候会查看某些容易引起crash的操作是否是在主线程,这里举三种方法: 方 ...

  2. Android Handler 异步调用修改界面与主线程

    在Android编程的过程中,如果在Activity中某个操作会运行比较长的时间,比如:下载文件.这个时候如果在主线程中直接下载文件,会造成Activity卡死的现象:而且如果时间超过5秒,会有ANR ...

  3. Android ActivityThread(主线程或UI线程)简介

    1. ActivityThread功能 它管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),并根据AMS的要求(通过IApplicationThread接口,AMS为Client ...

  4. Android更新主线程UI的两种方式handler与runOnUiThread()

    在android开发过程中,耗时操作我们会放在子线程中去执行,而更新UI是要主线程(也叫做:UI线程)来更新的,自然会遇到如何更新主线程UI的问题.如果在主线程之外的线程中直接更新页面显示常会报错.抛 ...

  5. Android 线程与主线程

    网络连接需要时间.Web服务器可能需要1~2秒的时间来响应,文件下载则耗时更久.考虑到这个因素,Android禁止任何主线程网络连接行为.即使强行为之,Android也会抛出NetworkOnMain ...

  6. android主线程ActivityThread

    ActivityThread在Android中它就代表了Android的主线程,但是并不是一个Thread类. 源码如下: http://androidxref.com/6.0.0_r1/xref/f ...

  7. 2017-11-29 由runnable说起Android中的子线程和主线程

    1.首先纠正一个观点,就是runnable运行在子线程中是错误的观念.runnable只是创建了一个执行任务的对象,但是它本身并不会创建一个新的子线程,Runable只是给你接口让你实现工作线程的工作 ...

  8. android的子线程切换到主线程

    在子线程中,如果想更新UI,必须切换到主线程,方法如下: if (Looper.myLooper() != Looper.getMainLooper()) { // If we finish mark ...

  9. 关于ViewPager设置属性页setCurrentItem会阻塞主线程ANR总结

    关于android开发设置View Pager的直接跳转页set CurrentItem会阻塞主线程ANR. 根据网上解决的说法,分析源码: if (mFirstLayout) { // We don ...

随机推荐

  1. POJ3259(Wormholes) 判断负环

    题意: 农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M 条路,和W个 虫洞组成,FJ想从一块土地开始,经过若干条路和虫洞 ...

  2. linux screen 命令 :离线运行程序

    screen工具是linux下虚拟终端的一个常用工具.在 发现这个工具之前,笔者经常在远程ssh中运行需要长时间处理数据的命令,比如远程编译安装软件,如果在编译的过程中网络断开,那这个编译进程就会停止 ...

  3. 神奇的操作——线段树合并(例题: BZOJ2212)

    什么是线段树合并? 首先你需要动态开点的线段树.(对每个节点维护左儿子.右儿子.存储的数据,然后要修改某儿子所在的区间中的数据的时候再创建该节点.) 考虑这样一个问题: 你现在有两棵权值线段树(大概是 ...

  4. 机器学习&深度学习资料收集

    缘由 以下博客都是我在学习过程中看到的一些知识讲解非常好的博文,就不转载了,直接给出链接方便以后重复访问.有了自己的理解之后再重新整理资料发布吧 : ) sklearn系列 http://www.cn ...

  5. Linux磁盘和文件系统简介

    Linux磁盘和文件系统简介 1.文件系统:存储设备上存储数据的方式方法 磁盘主要由盘片.机械手臂.磁头和主轴马达组成,而数据的写入实际是写在盘片上,磁盘的最小存储单位为扇区,每个扇区为512字节,扇 ...

  6. Elasticsearch中使用groovy脚本处理boolean字段的一个问题

    Elasticsearch中使用groovy脚本获取文档的bool字段值时,得到的值是字符的 'T' 或者 'F' ,而不是bool值 true 和 false . 比如文档中有一个字段是 { &qu ...

  7. CF1043

    找个下午打了场CF,结果被某uranus吊打......一千多名,过弱. T1,一眼二分了,后来发现题解是O(1)的hhh T2,题意精炼一下就是让你找一个串的循环节个数,直接n²枚举..... T3 ...

  8. WebLogic安装及部署

    安装(输入命令打开安装窗口) 打开命令终端,cd 到你wls1036_generic.jar存放的目录下 在终端输入:java -Dspace.detection=false -jar wls1036 ...

  9. Python自定义Module中__init__.py文件介绍

    ./pyModuleTest/├── addutil│   ├── add.py│   ├── add.pyc│   ├── __init__.py│   ├── __init__.pyc│   └─ ...

  10. 第2课:什么是SQL注入

    SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义. 随着B/S模式被广泛的应用,用这种模式编写应用程序的程序员也越来越多,但由于开发人员的水 ...