Handler解析
2015-09-17 16:50
495 查看
Handler 允许你发送和处理消息或者跟线程相关的Runable对象。每一个Handler实例被一个单线程以及线程的消息队列关联。当你创建一个新的Handler的时候,它被绑定到创建它的线程以及对应的消息队列。从这一点讲它们传递消息和runables到消息队列并且处理它们当它们从消息队列中出来的时候。
Handler有两个作用:
(1)调度消息和runable使其在以后某个时间点被执行
(2)在不同的线程上插入action并执行
Handler发送消息相关的函数有:
当你传递消息的时候,你可以让消息立即得到处理或者指定延迟的时间或者执行的时间,后面两种允许你完成timeouts, ticks, 以及其它 timing-based behavior
当一个进程被你的app创建的时候,主线程专门运行一个消息队列来管理顶层的app对象(activities, broadcast receivers, etc)以及任何它创建的窗口。你可以创建自己的线程并且用Handler和主线程通信。这些可以通过在你的新线程中通过调用post或者sendMessage函数来实现。给出的message或者runable将会在适合的时机在Handler的message队列中被调度。
1 数据成员
2 一些重要的函数或者接口
2.1
当用此实例化一个Handler对象时候就不必要用子类继承Handler了
2.2
子类必须实现这个函数来接受消息。
2.3
这个用来处理消息,可以在Looper中的消息循环中看到这个函数被调用
2.4
构造函数中重要的一个
这个构造函数是很多Handler的构造函数都会调用的构造函数,从中可以看出,handler的成员mQueue,mLooper都是通过Looper.myLooper()函数获取的,从Looper的代码分析可以知道Looper对象是和创建它的对象一对一的关系,那么这里的Handler自然也就和创建它的对象相关了,必然的消息队列也是相关的了。(前提是构造函数中没有指定Looper)
参考文献:
http://android.toolib.net/reference/android/os/Handler.html http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
安卓源码
Handler有两个作用:
(1)调度消息和runable使其在以后某个时间点被执行
(2)在不同的线程上插入action并执行
Handler发送消息相关的函数有:
post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), sendMessageDelayed(Message, long)
当你传递消息的时候,你可以让消息立即得到处理或者指定延迟的时间或者执行的时间,后面两种允许你完成timeouts, ticks, 以及其它 timing-based behavior
当一个进程被你的app创建的时候,主线程专门运行一个消息队列来管理顶层的app对象(activities, broadcast receivers, etc)以及任何它创建的窗口。你可以创建自己的线程并且用Handler和主线程通信。这些可以通过在你的新线程中通过调用post或者sendMessage函数来实现。给出的message或者runable将会在适合的时机在Handler的message队列中被调度。
1 数据成员
final MessageQueue mQueue; final Looper mLooper; final Callback mCallback; final boolean mAsynchronous; IMessenger mMessenger;
2 一些重要的函数或者接口
2.1
public interface Callback { public boolean handleMessage(Message msg); }
当用此实例化一个Handler对象时候就不必要用子类继承Handler了
2.2
public void handleMessage(Message msg) { }
子类必须实现这个函数来接受消息。
2.3
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
这个用来处理消息,可以在Looper中的消息循环中看到这个函数被调用
2.4
构造函数中重要的一个
public Handler(Callback callback, boolean async) { 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) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; mCallback = callback; mAsynchronous = async; }
这个构造函数是很多Handler的构造函数都会调用的构造函数,从中可以看出,handler的成员mQueue,mLooper都是通过Looper.myLooper()函数获取的,从Looper的代码分析可以知道Looper对象是和创建它的对象一对一的关系,那么这里的Handler自然也就和创建它的对象相关了,必然的消息队列也是相关的了。(前提是构造函数中没有指定Looper)
public String getMessageName(Message message) public final Message obtainMessage()
参考文献:
http://android.toolib.net/reference/android/os/Handler.html http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
安卓源码
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories