android 判断是否在主线程的方法

来源:互联网 发布:恐怖黎明官方数据库 编辑:程序博客网 时间:2024/05/24 06:50

核心方法如下:

 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。

2 0
原创粉丝点击