|
本帖最后由 ancientcc 于 2020-4-3 21:01 编辑
Looper
Looper提供了一种机制,让caller可以把一些操作序列化到某个特定的线程去执行,特定线程是指执行pollOnce的线程。
pollOnce线程会执行两类操作。第一类是触发fd之后执行的,执行的操作是在addFd时指定的callback。这类操作无法做到同步投递、执行、返回,即触发事件到所在函数返回后,可能pollOnce线程还没执行此事件。第二类是通过sendMessage或sendMessageDelayed过来,执行的操作在message中的handler指定。handler类型是MessageHandler,它是纯虚函数类,只有一个操作:handleMessage。MessageHandler的派生类自个实现handleMessage,从而实现自个的回调操作。这类操作可以做到同步投递、执行、返回。
线程模型。一般会存在两个或更多的线程。pollOnce运行在一个线程。触发fd、sendMessage或sendMessageDelayed的线程在一个或多个其它的线程。
- status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
- nsecs_t reltime, uint32_t /* flags */) {
- status_t res = mEventQueue.postMessage(msg, reltime);
- if (res == NO_ERROR) {
- msg->wait();
- }
- return res;
- }
- class MessageBase: public MessageHandler
- {
- public:
- MessageBase();
-
- // return true if message has a handler
- virtual bool handler() = 0;
- // waits for the handler to be processed
- void wait() const { barrier.wait(); }
- protected:
- virtual ~MessageBase();
- private:
- virtual void handleMessage(const Message& message) {
- this->handler();
- barrier.open();
- }
- mutable Barrier barrier;
- };
- status_t MessageQueue::sendMessageSync(const sp<MessageBase>& msg, nsecs_t relTime)
- {
- const Message dummyMessage;
- mLooper->sendMessage(msg, dummyMessage);
- msg->wait();
- }
复制代码
屏障(Barrier)是<aosp>/frameworks/base/libs/hwui/thread/Barrier.h实现的、用于输助同步的工具类。构造MessageBase时被构造,并处于关闭状态(没信号)。sendMessageSync调用mLooper->sendMessage向Looper投递消息后,等待屏障打开。pollOnce线程执行handleMessage,私有操作结束后打开屏障,sendMessageSync就收到屏障开了,可以继续执行。实现了同步投递、执行、返回
如何从String8转成char*
- String8 name("account_id");
- const char* c_str = name.string();
复制代码
|
|