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的线程在一个或多个其它的线程。

  1. status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
  2.         nsecs_t reltime, uint32_t /* flags */) {
  3.     status_t res = mEventQueue.postMessage(msg, reltime);
  4.     if (res == NO_ERROR) {
  5.         msg->wait();
  6.     }
  7.     return res;
  8. }


  9. class MessageBase: public MessageHandler
  10. {
  11. public:
  12.   MessageBase();
  13.    
  14.   // return true if message has a handler
  15.   virtual bool handler() = 0;

  16.   // waits for the handler to be processed
  17.   void wait() const { barrier.wait(); }

  18. protected:
  19.   virtual ~MessageBase();

  20. private:
  21.   virtual void handleMessage(const Message& message) {
  22.     this->handler();
  23.     barrier.open();
  24.   }
  25.   mutable Barrier barrier;
  26. };

  27. status_t MessageQueue::sendMessageSync(const sp<MessageBase>& msg, nsecs_t relTime)
  28. {
  29.   const Message dummyMessage;
  30.   mLooper->sendMessage(msg, dummyMessage);
  31.   msg->wait();
  32. }
复制代码

屏障(Barrier)是<aosp>/frameworks/base/libs/hwui/thread/Barrier.h实现的、用于输助同步的工具类。构造MessageBase时被构造,并处于关闭状态(没信号)。sendMessageSync调用mLooper->sendMessage向Looper投递消息后,等待屏障打开。pollOnce线程执行handleMessage,私有操作结束后打开屏障,sendMessageSync就收到屏障开了,可以继续执行。实现了同步投递、执行、返回

如何从String8转成char*
  1. String8 name("account_id");
  2. const char* c_str = name.string();
复制代码






欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3