You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1.4 KiB
1.4 KiB
怎么同步处理消息?
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;
}
}
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;
}
总结
- 同步等待消息的处理
- Binder 调用统一切换工作线程