二、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
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也会不断的被调用。