核心方法如下:

 public class ThreadUtils {    public static final String TAG = "ThreadUtils";    public static boolean isInMainThread() {        Looper myLooper = Looper.myLooper();        Looper mainLooper = Looper.getMainLooper();        Log.i(TAG, "isInMainThread myLooper=" + myLooper + ";mainLooper=" + mainLooper);        return myLooper == mainLooper;    }}

咱们实际测试一下,看看日志的打印:

  @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        System.out.println("isInMainThread()=" + ThreadUtils.isInMainThread());//在这里调用一下方法        }

打印日志:

10-25 09:57:59.933 8772-8772/com.everyoo.handlerdaemon I/ThreadUtils: isInMainThread myLooper=Looper (main, tid 1) {70cc4e8};mainLooper=Looper (main, tid 1) {70cc4e8}10-25 09:57:59.933 8772-8772/com.everyoo.handlerdaemon I/System.out: isInMainThread()=true

myLooper=Looper (main, tid 1) {70cc4e8}
mainLooper=Looper (main, tid 1) {70cc4e8}

说明:很显然,当前线程是在主线程,isInMainThread()=true。


如果在主线程开启一个子线程:

 new Thread(new Runnable() {            @Override            public void run() {                System.out.println("isInChlidThread()=" + ThreadUtils.isInMainThread());            }        }).start();

打印日志:

10-25 09:57:59.941 8772-9006/com.everyoo.handlerdaemon I/ThreadUtils: isInMainThread myLooper=null;mainLooper=Looper (main, tid 1) {70cc4e8}10-25 09:57:59.941 8772-9006/com.everyoo.handlerdaemon I/System.out: isInChlidThread()=false

注意:myLooper=null
mainLooper=Looper (main, tid 1) {70cc4e8}
为什么myLooper=null为空呢?这是因为Android中的线程默认没有一个和它绑定了的消息循环(Threads by default do not have a message loop associated with them. Of course, the method works)


如果初始化Looper对象并且启动,看代码:

 new Thread(new Runnable() {            @Override            public void run() {                Looper.prepare();//初始化Looper对象                System.out.println("isInChlidThread()=" + ThreadUtils.isInMainThread());                Looper.loop();//启动Looper            }        }).start();

打印日志:

10-25 09:57:59.950 8772-9007/com.everyoo.handlerdaemon I/ThreadUtils: isInMainThread myLooper=Looper (Thread-153, tid 153) {9984c2e};mainLooper=Looper (main, tid 1) {70cc4e8}10-25 09:57:59.950 8772-9007/com.everyoo.handlerdaemon I/System.out: isInChlidThread() isThresdMeod1=false

myLooper=Looper (Thread-153, tid 153) {9984c2e}
mainLooper=Looper (main, tid 1) {70cc4e8}

虽然myLooper不为null了,但是他们却不属于同一个Looper对象。并不是我们的主线程,所以返回false。

我们还有一种更简单方法,直接通过日志就能看出是主线程还是子线程。并且能分析是不是为同一个子线程。看如下代码:

 @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Log.i(TAG, "onCreate: 我是ui线程");        new Thread(new Runnable() {            @Override            public void run() {                Log.i(TAG, "onCreate: 我是子线程");            }        }).start();

日志打印:

android 判断是否在主线程的方法_第1张图片

ps:看,红色标记框里的内容。14090 就是我们的主线程号,而14151 就是我们的子线程号。至于是不是同一个子线程,我们通过比对线程号,就能轻松的知道啦!

更多相关文章

  1. android解决UI阻塞问题——创建AsyncTask 子线程
  2. Android support和Androidx库不能共存问题【android日志小记】
  3. android studio 55[2]线程更新UI handler 2
  4. Android Activity sleep 自线程更新主线程UI
  5. Android 为什么主线程的looper 一直循环不会ANR
  6. Android使用Sensor感应器实现线程中刷新UI创建android测力计的功
  7. Android引入广播机制的用意。单线程模型Message、Handler、Messa
  8. UWP与Android中如何在多线程中刷新UI

随机推荐

  1. android 传感器
  2. android editText 输入字数限制
  3. Android获取基站坐标代码
  4. Android(安卓)ArrayAdapter的使用
  5. Android使用HttpURLConnection获取数据
  6. android 之用Hello World做项目结构分析
  7. android获取imei和imsi
  8. Android实现登录对话框
  9. android:inputType的XML与Java代码对应关
  10. [Android] RatingBar详解