【Android实战】----从Retrofit源代码分析到Java网络编程以及HTTP权威指南想到的

时间:2022-10-19 11:01:16

一、简单介绍

接上一篇【Android实战】----基于Retrofit实现多图片/文件、图文上传中曾说非常想搞明确为什么Retrofit那么屌。

近期也看了一些其源代码分析的文章以及亲自查看了源代码,发现其对Java网络编程及HTTP权威指南有了一个非常好的诠释。一直以来。都信奉一个原则。在这个新技术日新月异的时代。怎样在Java界立足。凭借的就两点:

1、基本功。包含:Java基本知识,(Java编程思想、Effective Java)。Java进阶(Java虚拟机、Java设计模式)、网络相关(这个时代没有网络就没有一切,Java网络编程、HTTP权威指南、TCP/IP协议)。计算机系统相关(编译原理、深入理解计算机系统等)这些都是根本,所谓万变不离其宗,在掌握这些基本功的基础上,再学习新技术,面对日新月异的新技术时就会游刃有余。

2、将琐碎知识串联起来的能力。也就是归纳总结能力。

不管是在工作中还是学习中,起初用到的知识是东一块、西一块。事实上很多东西都是关联的,通过系统的梳理形成自己的知识体系,打造属于自己的专属领域,这也是在Java界立足的根本。

以上这些纯属自己这段时间的瞎想胡扯,大家共勉。

二、Retrofit简单介绍

可參见Jake Wharton的演讲https://realm.io/cn/news/droidcon-jake-wharton-simple-http-retrofit-2/

retrofit是由square公司开发的。

square在github上公布了非常多优秀的Android开源项目。比如:otto(事件总线),leakcanary(排查内存泄露),android-times-square(日历控件),dagger(依赖注入),picasso(异步载入图片),okhttp(网络请求),retrofit(网络请求)等等。

很多其它square上的开源项目我们能够去square的GitHub进行查看。

依据Retrofit的官方文档(https://github.com/square/retrofithttp://square.github.io/retrofit/)看Retrofit是

A type-safe HTTP client for Android and Java

可见Retrofit能够应用到Android平台和Java平台中。其源代码中也可看出retrofit2\Platform.java

private static Platform findPlatform() {
try {
Class.forName("android.os.Build");
if (Build.VERSION.SDK_INT != 0) {
return new Android();
}
} catch (ClassNotFoundException ignored) {
}
try {
Class.forName("java.util.Optional");
return new Java8();
} catch (ClassNotFoundException ignored) {
}
try {
Class.forName("org.robovm.apple.foundation.NSObject");
return new IOS();
} catch (ClassNotFoundException ignored) {
}
return new Platform();
}

可见能够应用在Android、Java8及IOS平台中,当然在IOS中要基于RoboVM。RoboVM它是一种能够在iOS设备上执行Java应用程序的技术,这样的技术主要还是用于在游戏开发中。

Retrofit简化了从Web API下载数据。解析成普通的Java对象(POJO)。

Retrofit重要的一点是应用了Java中的动态代理机制http://blog.csdn.net/honghailiang888/article/details/50619545。有必要好好研究下:

/**
* Create an implementation of the API endpoints defined by the {@code service} interface.
* <p>
* The relative path for a given method is obtained from an annotation on the method describing
* the request type. The built-in methods are {@link retrofit2.http.GET GET},
* {@link retrofit2.http.PUT PUT}, {@link retrofit2.http.POST POST}, {@link retrofit2.http.PATCH
* PATCH}, {@link retrofit2.http.HEAD HEAD}, {@link retrofit2.http.DELETE DELETE} and
* {@link retrofit2.http.OPTIONS OPTIONS}. You can use a custom HTTP method with
* {@link HTTP @HTTP}. For a dynamic URL, omit the path on the annotation and annotate the first
* parameter with {@link Url @Url}.
* <p>
* Method parameters can be used to replace parts of the URL by annotating them with
* {@link retrofit2.http.Path @Path}. Replacement sections are denoted by an identifier
* surrounded by curly braces (e.g., "{foo}"). To add items to the query string of a URL use
* {@link retrofit2.http.Query @Query}.
* <p>
* The body of a request is denoted by the {@link retrofit2.http.Body @Body} annotation. The
* object will be converted to request representation by one of the {@link Converter.Factory}
* instances. A {@link RequestBody} can also be used for a raw representation.
* <p>
* Alternative request body formats are supported by method annotations and corresponding
* parameter annotations:
* <ul>
* <li>{@link retrofit2.http.FormUrlEncoded @FormUrlEncoded} - Form-encoded data with key-value
* pairs specified by the {@link retrofit2.http.Field @Field} parameter annotation.
* <li>{@link retrofit2.http.Multipart @Multipart} - RFC 2388-compliant multipart data with
* parts specified by the {@link retrofit2.http.Part @Part} parameter annotation.
* </ul>
* <p>
* Additional static headers can be added for an endpoint using the
* {@link retrofit2.http.Headers @Headers} method annotation. For per-request control over a
* header annotate a parameter with {@link Header @Header}.
* <p>
* By default, methods return a {@link Call} which represents the HTTP request. The generic
* parameter of the call is the response body type and will be converted by one of the
* {@link Converter.Factory} instances. {@link ResponseBody} can also be used for a raw
* representation. {@link Void} can be used if you do not care about the body contents.
* <p>
* For example:
* <pre>
* public interface CategoryService {
* @POST("category/{cat}/")
* Call<List<Item>> categoryList(@Path("cat") String a, @Query("page") int b);
* }
* </pre>
*/
@SuppressWarnings("unchecked") // Single-interface proxy creation guarded by parameter safety.
public <T> T create(final Class<T> service) {
Utils.validateServiceInterface(service);
if (validateEagerly) {
eagerlyValidateMethods(service);
}
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get(); @Override public Object invoke(Object proxy, Method method, Object... args)
throws Throwable {
// If the method is a method from Object then defer to normal invocation.
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
ServiceMethod serviceMethod = loadServiceMethod(method);
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}

Retrofit依赖于OkHttp,终于的请求响应是在OkHttp中做的,性能之所以高,也是由于okHttp的性能高。

三、OkHttp简单介绍

android网络框架之OKhttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献。用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,如今已经打不出来)。
HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP efficiently makes your stuff load faster and saves bandwidth.

OkHttp is an HTTP client that’s efficient by default:
•HTTP/2 support allows all requests to the same host to share a socket.
•Connection pooling reduces request latency (if HTTP/2 isn’t available).
•Transparent GZIP shrinks download sizes.
•Response caching avoids the network completely for repeat requests. OkHttp perseveres when the network is troublesome: it will silently recover from common connection problems. If your service has multiple IP addresses OkHttp will attempt alternate addresses if the first connect fails. This is necessary for IPv4+IPv6 and for services hosted in redundant data centers. OkHttp initiates new connections with modern TLS features (SNI, ALPN), and falls back to TLS 1.0 if the handshake fails. Using OkHttp is easy. Its request/response API is designed with fluent builders and immutability. It supports both synchronous blocking calls and async calls with callbacks. OkHttp supports Android 2.3 and above. For Java, the minimum requirement is 1.7.

优势:
同意连接到同一个主机地址的全部请求,提高请求效率
共享Socket,降低对server的请求次数
通过连接池,降低了请求延迟
缓存响应数据来降低反复的网络请求
降低了对数据流量的消耗
自己主动处理GZip压缩

功能:

get,post等请求
文件的上传下载
载入图片(内部会图片大小自己主动压缩)
支持请求回调,直接返回对象、对象集合
支持session的保持
okHttp是直接封装的Socket,io流是基于Okio的。

四、Okio简单介绍

Okio is a new library that complements  java.io  and  java.nio  to make it much easier to access, store, and process your data.

Okio库是一个由square公司开发的,它补充了Java.io和java.nio的不足,以便能够更加方便,高速的訪问、存储和处理你的数据。OkHttp的底层也使用该库作为支持,而在开发中,使用该库能够大大给你带来方便。



总结:如今第三方开源框架非常之多,以至于我们能够更关注和高速的开发业务。可是这些第三方框架恰恰是我们应该学习的,它们将“简单介绍“”中说的基本功给剥夺了。像Retrofit用到了注解、动态代理等、OkHttp封装了Socket、连接池等、Okio是io操作更快捷。当中这些恰恰也是我们应该掌握的。学习Retrofit源代码使我又重温了Java网络编程、HTTP权威指南、Java IO操作等,其囊括的技术之多,令人叹服!就像做Java Web开发须要理解Spring、Hibernate等框架一样。在做业务的同一时候。其核心技术才应该是我们最该掌握和学习的。

做个广告。Spring相关可參考我的Spring实战系列:http://blog.csdn.net/honghailiang888/article/details/53113853







【Android实战】----从Retrofit源代码分析到Java网络编程以及HTTP权威指南想到的的更多相关文章

  1. &lbrack;置顶&rsqb;&NewLine; 【Android实战】----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的

    一.简介 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明白为什么Retrofit那么屌.最近也看了一些其源码分析的文章以及亲自查看了源码,发现其对 ...

  2. Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)

    本文转载 https://www.javadoop.com 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.c ...

  3. 这份书单会告诉你,Java网络编程其实很重要

  4. Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型

    本文转自:http://www.sohu.com/a/203838233_827544 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 ht ...

  5. Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型

    本文转载自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 http ...

  6. 20145205 《Java程序设计》实验报告五:Java网络编程及安全

    20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...

  7. 20145212 实验五《Java网络编程》

    20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...

  8. 20145213《Java程序设计》实验五Java网络编程及安全

    20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...

  9. 20145206《Java程序设计》实验五Java网络编程及安全

    20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...

随机推荐

  1. 从天猫和支付宝身上学习opcity与rgba

    不知道什么时候,一个双层透明的对话框悄然流行了起来. 我们在各大网站上都能见到类似这样的对话框: 这样的聚焦更明显,用户体验更好,也显得更加的高大上. 先说点题外话,这种布局如何用CSS+DIV去实现 ...

  2. 2&period;5 ListView

    ListView的工作原理如下: ListView 针对每个item,要求 adapter "返回一个视图" (getView),也就是说ListView在开始绘制的时候,系统首先 ...

  3. 关于http响应内容压缩的一点小积累。

    1.在tomcat的server.xml配置文件中,添加上背景颜色为绿色的配置,服务器就会自动压缩 <Connector port="80" maxHttpHeaderSiz ...

  4. 表单提交checkbox的值

    问题:怎么在表单提交的时候提交多个多选框CheckBox的值? 解决方式:在CheckBox的name属性名后添加[]; 例: <input type="checkbox" ...

  5. OCR技术浅探: 语言模型(4)

    由于图像质量等原因,性能再好的识别模型,都会有识别错误的可能性,为了减少识别错误率,可以将识别问题跟统计语言模型结合起来,通过动态规划的方法给出最优的识别结果.这是改进OCR识别效果的重要方法之一. ...

  6. iOS真机调试步骤(Xcode8&period;0以上版本)(2015年)

    方法/步骤(转载:http://jingyan.baidu.com/article/22fe7ced20cc073002617f97.html) 获取真机调试的证书,先在本地生成获取证书的文件,找不到 ...

  7. js&sol;vue图片压缩

    js版 新建compressImage.js,内容如下: // 将base64转换为blob(有需要可加上,没需要可不加) function convertBase64UrlToBlob(urlDat ...

  8. &period;net core使用RPC方式进行高效的HTTP服务访问

    传统的HTTP接口调用是一件比较繁琐的事情,特别是在Post数据的时候:不仅要拼访问的URL还是把数据序列化成流的方式给Request进行提交,获取Respons后还要对流进行解码.在实际应用虽然可以 ...

  9. 快速搭建日志系统——ELK STACK

    什么是ELK STACK ELK Stack是Elasticserach.Logstash.Kibana三种工具组合而成的一个日志解决方案.ELK可以将我们的系统日志.访问日志.运行日志.错误日志等进 ...

  10. IIS 使用 HTTP重定向 修改 默认主页

    1. 被自己坑死了 多了一个 正斜杠 浪费了好长好长的时间 2. 需求 直接输入ip地址 总是 弹出来 iis 的 welcome的界面 感觉很low 想要修改一下 曾经用过 reflesh 来修改过 ...