android.os.Looper:

Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来 使消息循环起作用,从消息队列里取消息,处理消息。

注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。


以下是Android API中的一个典型的Looper thread实现:
//Handler不带参数的默认构造函数:new Handler(),实际上是通过Looper.myLooper()来获取当前线程中的消息循环,
//而默认情况下,线程是没有消息循环的,所以要调用 Looper.prepare()来给线程创建消息循环,然后再通过,Looper.loop()来使消息循环起作用。
class LooperThread extends Thread {
public Handler mHandler;

public void run() {
Looper.prepare();

mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};

Looper.loop();
}
}

另,Activity的MainUI线程默认是有消息队列的。所以在Activity中新建Handler时,不需要先调用Looper.prepare()。

android.os.Handler:

Handler用于跟线程绑定,来向线程的消息循环里面发送消息、接受消息并处理消息。

以下是不带参数的Handler构造器:

public Handler() {

  if (FIND_POTENTIAL_LEAKS) {
final Class<? extends Handler> klass = getClass();
if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
(klass.getModifiers() & Modifier.STATIC) == 0) {
Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
klass.getCanonicalName());
}
}

mLooper = Looper.myLooper();
if (mLooper == null) {

//如果当前线程里面没有消息循环的时候,系统抛出异常。即在一个线程里如果想用Handler来处理消息,是需要调用Looer.prepare()来创建消息循环的,而MainUI线程不需要。

throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = null;
}

通过以下函数来向线程发送消息或Runnable: 1、post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long);   当线程接收到Runnable对象后即立即或一定延迟调用。 2、sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)。   当线程接受到这些消息后,根据你的Handler重构的handleMessage(Message)根据接收到的消息来进行处理。 另,一个Activity主线程中可以有多个Handler对象,但MessageQueueLooper是只有一个,对应的Looper也是只有一个。

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 卷二 Dalvik与Android源码分析 第二章 进程与线程 2.2 Dalvik线
  3. android一个小网络图片查看器
  4. android之ThreadLocal详解
  5. Android在子线程更新UI主线程的6种方法
  6. 【干货】快速理解Android(安卓)中的 Handler机制
  7. EventThread线程对VSync的接收
  8. android MediaCodec ACodec OMX tips
  9. 使用Handler在子线程中更新UI

随机推荐

  1. Windows server 2008 r2上安装MySQL5.7.1
  2. MySQL无法读表错误的解决方法(MySQL 1018
  3. redhat7通过yum安装mysql5.7.17教程
  4. 详解MySQL日期 字符串 时间戳互转
  5. Linux安装MySQL5.6.24使用文字说明
  6. mysql 5.7.17 免安装版配置方法图文教程(
  7. Windows下安装MySQL 5.7.17压缩版中遇到
  8. cocos2d-x 2.x版本之win32 window移植and
  9. Android应用开发中的风格和主题(style,th
  10. android程序目录结构及分析