Android 事件处理过程,读取事件线程,(2)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值