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
原创粉丝点击