怎么同步处理消息?
这个服务可以是应用自己的服务,也可以是系统服务,请求都会调到binder线程池里,binder线程将请求转到工作线程里去处理,工作线程在处理这个请求的过程中,这个binder线程一直在那等着。应用端也一直等着返回结果。
在工作线程处理请求的原因:binder线程不想上锁,因为IPC调用是在binder线程池里,涉及到多线程同步的问题。倒出上锁很麻烦。
Framework有哪些同步处理消息的场景
应用端向SurfaceFlinger发起创建surface请求,native层
应用端向SurfaceFlinger发起创建surface请求,java层
DEMO工程,测试同步处理消息
同步处理消息有几种处理方式:
1. 反射调用Handler的runWithSissors方法
不要在UI线程调用这个方法,这个方法可能会把UI线程挂起,这个方法不能拿到返回结果
2. BlockingRunnable
可以得到result
3.
FutureTask;实现了Runnable和Future,可以得到处理结果
动态代理怎么统一切换工作线程?
setName方法是运行在binder线程里,
现在要统一把setName方法切换到别的线程
通过动态代理生成mServiceImpl对象,他其实是RemoteServiceImpl的动态代理,这个动态代理的作用:虽然mServiceImpl.setName(name)运行在binder线程,但RemoteServiceImpl的接口比如setName,是运行在UI线程的