UI线程是从ActivityThread.java类的main()方法里面启动的,并在启动的时候,调用了Looper.prepareMainLooper()方法生成looper对象。
另外该线程还创建了MessageQueue消息队列,因此可以直接在Activity里面创建Handler对象并进行通信。
自定义的普通线程可以在需要的地方创建并启动,没什么限制,他是一个裸线程,既没有looper对象的存在,也没有MessageQueue对象的存在,不能直接创建Handler进行通信,如果要在子线程里面是有Handler进行通信,需要做这些处理:
Looper.prepare();
mHandler = new Handler(Looper.myLooper());
Looper.loop();
即在创建Handler对象之前,调用Looper.prepare();,准备好looper和MessageQueue对象。
在Activity的onResume()方法里面,当我们进行UI更新操作时,系统还对当前线程是否是UI线程做了检查校验,以保证刷新View的线程安全。子线程从onResume()方法某个时间点开始就不能再刷新View了。