Android 事件处理过程,读取事件线程,(2)
来源:互联网 发布:国外的知乎 编辑:程序博客网 时间:2024/06/16 13:18
二、InputReaderThread,
InputManager创建的两个主要线程之一InputReaderThread,它的主要工作是轮询设备节点是不是有新的事件发生,这是一个独立的循环线程。他的运行通过前面提到的 mReaderThread→run()这个run方法启动的,这个run方法接着调用_threadLoop,InputReaderThread的核心实现类是InputReader,所以接着调用了InputReader的loopOnce进入循环,在这个循环中通过EventHub从设备节点获取事件,处理事件,然后把事件发给监听者,这个监听者就是InputDispatch,因为InputDispatch间接实现了InputListenerInterface接口。
接着分析这个线程是怎么启动的,因为InputReaderThread继承自Thread,而且本身没有run方法,所以执行了的是Thread类的run方法,这个Thread类是:system/core/libutils/threads.cpp
status_t Thread::run(const char* name, int32_t priority, size_tstack)@Threads.cpp{
createThreadEtc(_threadLoop,
this,name, priority, stack, &mThread);
}
这里只写了第一次参数,就是那个_threadLoop
inline bool createThreadEtc(thread_func_tentryFunction,...)@Threads.cpp{
returngCreateThreadFn(entryFunction, userData, threadName,
threadPriority,threadStackSize, threadId);
}
接下来的方法androidCreateRawThreadEtc调用,区分了win32还是非win32,Android是基于Linux的,所以不是win32 ,这里调用了pthread_create才是真正去创建一个线程,并且会执行其_threadLoop方法。
intandroidCreateRawThreadEtc(android_thread_func_t entryFunction,)@Threads.cpp{
intresult = pthread_create(&thread, &attr,
(android_pthread_entry)entryFunction,userData);
}
接着看它的_threadLoop方法,这里就是调用了子类的threadLoop,这里的参数user指针是什么怎么赋值的,没太看明白,不知道是不是上一步中的userData变量,可能要进入到内核层才能看到这个过程。
int Thread::_threadLoop(void*user)@Threads.cpp{
result= self->threadLoop();
}
然后到了 InputReader.cpp。
bool InputReaderThread::threadLoop()@InputReader.cpp{
mReader->loopOnce();
}
这个循环就是读取事件,处理事件,然后通知监听者。
void InputReader::loopOnce()@InputReader.cpp{
size_tcount = mEventHub->getEvents(timeoutMillis, mEventBuffer,
EVENT_BUFFER_SIZE);
processEventsLocked(mEventBuffer,count);
mPolicy->notifyInputDevicesChanged(inputDevices);
mQueuedListener->flush();
}
你可能会有疑问它是怎么循环的? loopOnce明明只调用了一次,的确是只调用了一次,从名字也看的出来。
但是读取事件肯定是在一直循环的,要弄明白读取事件的线程是怎么循环的,就要往上追踪,谁调用了LoopOnce,是InputReaderThread中的 threadLoop()方法。
bool InputReaderThread::threadLoop()@InputReader.cpp{
mReader->loopOnce();
return true;
}
这个方法只有两句代码,注意它的返回值是true,这点很重要。在往上追踪,是Threads.cpp的_threadLoop()方法。
int Thread::_threadLoop(void*user)@system/core/libutils/Threads.cpp{
sp<Thread>strong(self->mHoldSelf);
do{
boolresult;
result= self->threadLoop();
if(result == false || self->mExitPending) {
break;
}
}while(strong!= 0);
}
这里是有while循环的,首先strong这个指针它代表的是子线程,是不为null的,那么这个while循环结束的条件就是那个if表达式,一个是线程主动退出即mExitPending,一个是result为false,这个result就是子线程threadLoop 的返回值,上面已经提到了,在 InputReaderThread返回的是true,所以子类的 threadLoop方法就会不断的被调用,loopOnce也会不断的被调用。
- Android 事件处理过程,读取事件线程,(2)
- Android输入事件从读取到分发三:InputDispatcherThread线程分发事件的过程
- Android输入事件从读取到分发三:InputDispatcherThread线程分发事件的过程
- Android事件处理过程分析
- Android 键盘事件处理过程
- Android 事件处理过程,(1)
- android中的触摸事件处理过程详解
- Android输入事件处理过程分析
- Android之UI事件处理过程
- android的触摸事件处理过程详解
- nginx事件处理过程
- 事件传递/处理过程
- 通用事件处理过程
- Android的事件处理2
- 【Android】 Android 事件处理
- 使用新线程处理事件
- Android输入事件从读取到分发五:事件分发前的拦截过程
- Android输入事件从读取到分发五:事件分发前的拦截过程
- 第三周 项目2-建设“顺序表”算法库
- JS中的event 对象详解
- 乐卓WarGod Z1定义手机多玩法
- 一步两步,学习大数据(三)——Hadoop集群安装
- 关于数据类型的一些知识
- Android 事件处理过程,读取事件线程,(2)
- bzoj 1024(DFS)
- BZOJ1237 配对 [DP]
- 随机抽样一致性(RANSAC)算法
- 简单的jquery选项卡功能
- eval和exec的区别
- android MTK SIM双卡,apn,subid和slotid相关
- web服务端访问xml资源文件的路径问题
- HDU-2546