博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代理模式相关使用
阅读量:6452 次
发布时间:2019-06-23

本文共 1947 字,大约阅读时间需要 6 分钟。

一、一般应用场景

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

二、Retrofit代理模式分析:

1、Retrofit使用:

定义接口:

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

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

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

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

public 
T create(final Class
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
serviceMethod = Retrofit.this.loadServiceMethod(method); OkHttpCall
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的方法。

转载地址:http://qxgwo.baihongyu.com/

你可能感兴趣的文章
理解Docker :Docker 网络
查看>>
通过Application存取公共数据比如登录信息等..
查看>>
intellij maven配置与使用
查看>>
SpringMVC文件下载与JSON格式
查看>>
Q:图像太大,在opencv上显示不完全
查看>>
修正锚点跳转位置 避免头部fixed固定部分遮挡
查看>>
Dubbo序列化多个CopyOnWriteArrayList对象变成同一对象的一个大坑!!
查看>>
linux下ping不通的解决方法
查看>>
利用ItextPdf、core-renderer-R8 来生成PDF
查看>>
irc操作小记
查看>>
JAVA 与 PHP 的不同和相同
查看>>
建立Ftp站点
查看>>
NavigationController的使用
查看>>
多线程编程之Windows环境下创建新线程
查看>>
ASP.Net MVC的开发模式
查看>>
groupbox 下的datagridview的列标题字体修改混乱
查看>>
HDU-3092 Least common multiple---数论+分组背包
查看>>
CentOS 7使用systemctl如何补全服务名称
查看>>
Unity3D NGUI 给button按钮添加单间事件
查看>>
C# 使用各种API
查看>>