WEB开发网
开发学院手机开发Android 开发 Android 事件传递机制 阅读

Android 事件传递机制

 2010-03-24 05:33:00 来源:WEB开发网   
核心提示:int classType, Object event) {boolean poke = mFirst.next == mLast;QueuedEvent ev = obtainLocked(device, when, flags, classType, event);QueuedEvent p = mLast.pre

int classType, Object event) {

boolean poke = mFirst.next == mLast;

QueuedEvent ev = obtainLocked(device, when, flags, classType, event);

QueuedEvent p = mLast.prev;

while (p != mFirst && ev.when < p.when) {

p = p.prev;

}

ev.next = p.next;

ev.prev = p;

p.next = ev;

ev.next.prev = ev;

ev.inQueue = true;

}

该函数加到消息队列中,该消息队列就是个双向连表,头和尾分别是 final QueuedEvent mFirst;

final QueuedEvent mLast; 该函数就是把新消息插到尾的前面。

消息队列有了。还需要读队列。在WindowManagerService.java 类中同时又开了个内部线程

mInputThread = new InputDispatcherThread();

mInputThread.start();

该线程和刚才的写队列线程是并行的。该线程起来后,通过

public void run() {

while (true) {

try {

process();

} catch (Exception e) {

Log.e(TAG, "Exception in input dispatcher", e);

}

}

}

这个process()函数来读消息。具体实现是

private void process() {

android.os.Process.setThreadPriority(

android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);

while (true) {

QueuedEvent ev = mQueue.getEvent(

(int)((!configChanged && curTime < nextKeyTime)

? (nextKeyTime-curTime) : 0));

}

该getEvent()函数的具体实现是

QueuedEvent getEvent(long timeoutMS) {

long begin = SystemClock.uptimeMillis();

final long end = begin+timeoutMS;

long now = begin;

synchronized (mFirst) {

while (mFirst.next == mLast && end > now) {

QueuedEvent p = mFirst.next;

mFirst.next = p.next;

mFirst.next.prev = mFirst;

p.inQueue = false;

return p;

Tags:Android 事件 传递

编辑录入:coldstar [复制链接] [打 印]
赞助商链接