Android AOP实现模块间通信
来源:互联网 发布:做淘宝客服工资怎么样 编辑:程序博客网 时间:2024/06/05 08:18
上一篇《Android Retrofit2.0 实现原理分析》我们分析了Retrofit2.0的实现原理,用到了AOP的方式,实现了注解的动态解析。
下面我们利用AOP的原理实现多模块的RPC通信。
工程目录
app module是client角色,rpc功能的调用者
apis 定义了rpc提供的所有接口,包含ITest1 、ITest2接口
rpc rpcservice模块,rpc功能的提供者,
module1实现了ITest1接口
module2实现了ITest2接口
public interface ITest1 { void test1(); }public interface ITest2 { String test2(); }
ITest1和ITest2接口
public class MainActivity extends AppCompatActivity { private RPCService service ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { service = new RPCService(); findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ITest1 test1 = service.create(ITest1.class); test1.test1(); } }); findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ITest2 test2 = service.create(ITest2.class); String result = test2.test2(); Log.e("RPCTest","result:"+result); } }); }}
app client的主要代码,调用rpcservice的功能
通过create方法,间接的调用了Test接口实现类的方法
public class RPCService implements InvocationHandler{ private Map<String, Object> mApis = new HashMap<>(); public RPCService(){ initApis(); } private void initApis() { mApis.put(Test1.class.getInterfaces()[0].getSimpleName(), new Test1()); mApis.put(Test2.class.getInterfaces()[0].getSimpleName(), new Test2()); } @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { for (String key: mApis.keySet()){ Object object = mApis.get(key); try { if (object.getClass().getDeclaredMethod(method.getName(), new Class[]{}) != null) { return method.invoke(object, objects); } } catch (Exception e){ Log.e("RPCTest","Exception"); } } return null; } public <T> T create(Class<T> clazz) { return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[] { clazz }, this); }}
rpcservice的主要代码,利用了AOP的原理,内部用Map保存Test接口实现对象,在AOP invoke方法中,动态替换,用实现类对象调用方法。
public class Test1 implements ITest1 { @Override public void test1() { Log.e("RPCTest","test1"); }}public class Test2 implements ITest2 { @Override public String test2() { Log.e("RPCTest","test2"); return "test2"; }}ITest1和ITest2接口的实现类
简单的实现了app模块和rpc模块的通信,app模块不用知道ITest1和ITest2接口的实现,ITest1和ITest2的实现可以进一步单独分成两个模块,如下图所示
解决了模块间通信的问题,就可以并行开发,提高效率。
demo地址
http://download.csdn.net/detail/jasonwang18/9910619
阅读全文
1 0
- Android AOP实现模块间通信
- Android模块间通信
- Arduino蓝牙模块与Android实现通信
- Android通信模块
- Android端 同 单片机 利用蓝牙模块的通信实现
- Java,Android 实现AOP
- Android通信模块代码流程
- Android通信模块代码流程
- Android通信模块代码流程
- 初学者,DNN 模块间通信实现的总结
- 备忘:模块间通信
- 模块间通信 --linux
- 模块间通信EventBus
- Android BLE学习(二): Android与51822蓝牙模块通信流程的实现与分析
- Android BLE学习(二): Android与51822蓝牙模块通信流程的实现与分析
- Android模块化(二)——模块通信和模块间服务调用
- 【Arduino】开发入门【十】Arduino蓝牙模块与Android实现通信
- 【Arduino】开发入门【十】Arduino蓝牙模块与Android实现通信
- 理解c++STL regex_research()
- maven实战(六)使用Nexus创建私服
- Spring框架学习(1)——HelloWorld
- HDU 3697(H) ——Selecting courses(暴力枚举,贪心)
- Eclipse搭建SSH(Struts2+Spring3+Hibernate3)框架项目教程
- Android AOP实现模块间通信
- HDU1873 看病要排队【模拟+优先队列】
- jquery给input赋值val(val)
- 实现二叉树的前序/中序/后序递归、非递归遍历
- Ubuntu使用apt-file解决库或者文件缺失依赖
- 设置线程池的大小
- 关于Node.js的httpClieint请求报错ECONNRESET的原因和解决措施
- thinkphp5错误:类型错误: Argument 1 passed to think\Hook::import() must be of the type array
- 剑指offer题解C++【1】