SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4064|回复: 0
打印 上一主题 下一主题

[Android] Android一些注释

[复制链接]

187

主题

346

帖子

2450

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2450
跳转到指定楼层
楼主
发表于 2020-4-3 20:18:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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();
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2024-5-20 04:27 , Processed in 0.050642 second(s), 19 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表