上一篇《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.youkuaiyun.com/detail/jasonwang18/9910619