代理模式相关使用

一、一般应用场景

提供一个代理来控制对象的访问。一般在无法访问或者不想访问某个对象时,可以通过一个代理对象间接进行访问。

二、Retrofit代理模式分析:

1、Retrofit使用:
定义接口:

public interface MyService {
    @GET("users/{user}/list")
    Call<String> getMyList(@Path("user") String user);
}
复制代码

新建retrofit对象,然后产生一个接口对象。然后调用具体方法去完成请求

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://xxx.com")
            .build();
MyService myService = retrofit.create(MyService.class);
Call<String> myList = myService.getMyList("my");
复制代码

动态代理分析: retrofit.create方法就是通过动态代理的方式创建对象

public <T> T create(final Class<T> service) {
    Utils.validateServiceInterface(service);
    if(this.validateEagerly) {
        this.eagerlyValidateMethods(service);
    }

    return Proxy.newProxyInstance(service.getClassLoader(), new Class[]{service}, new InvocationHandler() {
        private final Platform platform = Platform.get();

        public Object invoke(Object proxy, Method method, @Nullable Object[] args) throws Throwable {
            if(method.getDeclaringClass() == Object.class) {
                return method.invoke(this, args);
            } else if(this.platform.isDefaultMethod(method)) {
                return this.platform.invokeDefaultMethod(method, service, proxy, args);
            } else {
                ServiceMethod<Object, Object> serviceMethod = Retrofit.this.loadServiceMethod(method);
                OkHttpCall<Object> okHttpCall = new OkHttpCall(serviceMethod, args);
                return serviceMethod.callAdapter.adapt(okHttpCall);
            }
        }
    });
}
复制代码

通过Proxy.newProxyInstance创建请求接口的动态代理对象,该动态代理对象可以拿到请求接口实例上所有注解,然后通过代理对象进行网络请求。

三、代理模式在Activity启动中的应用:

在Activity启动过程中,需要用到本地App进程和SystemServer进程的消息传递,主要用到了远程代理对象。

(1)应用进程通过startActivity开始启动,应用进程中有AMS(ActivityManagerService)的代理对象ActivityManagerProxy,通过这个代理可以调用到AMS中的方法,完成了本地进程对SystemServer进程中的方法调用。
(2)当AMS完成对权限、堆栈等信息处理后,需要再次对本地App进程进行通信。主要通过对代理对象IApplicationThread的调用,就可以调用到应用进程(被代理对象)ApplicationThread的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值