SDL中文论坛
标题:
Android一些注释
[打印本页]
作者:
ancientcc
时间:
2020-4-3 20:18
标题:
Android一些注释
本帖最后由 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();
复制代码
欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/)
Powered by Discuz! X3.3