parent
d066d53e48
commit
c70e218458
@ -0,0 +1,59 @@ |
|||||||
|
--- |
||||||
|
怎么同步处理消息? |
||||||
|
--- |
||||||
|
|
||||||
|
```c++ |
||||||
|
status_t Client::createSurface(const String&& name, ...){ |
||||||
|
sp<MessageBase> msg = new MessageCreateLayer(mFlinger.get(), name, this, w, h, format, flags, handle, gbp); |
||||||
|
mFlinger->postMessageSync(msg); |
||||||
|
return static_cast<MessageCreateLayer*>(msg.get())->getResult(); |
||||||
|
} |
||||||
|
status_t postMessageSync(const sp<MessageBase>& msg, ...){ |
||||||
|
mEventQueue.postMessage(msg, reltime); |
||||||
|
msg.wait(); |
||||||
|
} |
||||||
|
class MessageCreateLayer:public MessageBase{ |
||||||
|
status_t getResult() const{return result;} |
||||||
|
virtual bool handler(){ |
||||||
|
result = flinger->createLayer(name, client,w, h, format, ...); |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
```java |
||||||
|
public final boolean runWithScissors(final Runnable r, long timeout){ |
||||||
|
if(Looper.myLooper()==mLooper){ |
||||||
|
r.run(); |
||||||
|
return true; |
||||||
|
} |
||||||
|
BlockingRunnable br = new BlockingRunnable(r); |
||||||
|
return br.postAndWait(this, timeout); |
||||||
|
} |
||||||
|
private static final class BlockingRunnable implements Runnable{ |
||||||
|
public BlockingRunnable(Runnable task){ |
||||||
|
mTask = task; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void run(){ |
||||||
|
mTask.run(); |
||||||
|
mDone = true; |
||||||
|
notifyAll(); |
||||||
|
} |
||||||
|
} |
||||||
|
public boolean postAndWait(Handler handler, ...){ |
||||||
|
if(!handler.post(this)){ |
||||||
|
return false; |
||||||
|
} |
||||||
|
while(!mDone){ |
||||||
|
wait(); |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
#### 总结 |
||||||
|
|
||||||
|
1. 同步等待消息的处理 |
||||||
|
2. Binder 调用统一切换工作线程 |
Loading…
Reference in new issue