Android AOP实现模块间通信

上一篇《Android Retrofit2.0 实现原理分析》我们分析了Retrofit2.0的实现原理,用到了AOP的方式,实现了注解的动态解析。

下面我们利用AOP的原理实现多模块的RPC通信。


Android AOP实现模块间通信_第1张图片

工程目录

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 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 create(Class 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的实现可以进一步单独分成两个模块,如下图所示

Android AOP实现模块间通信_第2张图片

解决了模块间通信的问题,就可以并行开发,提高效率。

demo地址

http://download.csdn.net/detail/jasonwang18/9910619


你可能感兴趣的:(Android,框架)