别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述Android实战----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的相关的知识,希望能为你提供帮助。
一、简介
接上一篇【Android实战】----基于Retrofit实现多图片/文件、图文上传 中曾说非常想搞明白为什么Retrofit那么屌。最近也看了一些其源码分析的文章以及亲自查看了源码,
发现其对java网络编程及HTTP权威指南有了一个很好的诠释。一直以来,
都信奉一个原则,
在这个新技术日新月异的时代,
如何在Java界立足,
凭借的就两点:
1、基本功,
包括:
Java基本知识,
(
Java编程思想、Effective Java)
,
Java进阶(
Java虚拟机、Java设计模式)
、网络相关(
这个时代没有网络就没有一切,
Java网络编程、HTTP权威指南、TCP/IP协议)
,
计算机系统相关(
编译原理、深入理解计算机系统等)
这些都是根本,
所谓万变不离其宗,
在掌握这些基本功的基础上,
再学习新技术,
面对日新月异的新技术时就会游刃有余。
2、将琐碎知识串联起来的能力,
也就是归纳总结能力。无论是在工作中还是学习中,
起初用到的知识是东一块、西一块,
其实许多东西都是关联的,
通过系统的梳理形成自己的知识体系,
打造属于自己的专属领域,
这也是在Java界立足的根本。
【Android实战----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的】以上这些纯属自己这段时间的瞎想胡扯,
大家共勉。
二、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/retrofit及http://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,现在已经打不出来)。
推荐阅读
- Android Things 专题6 完整的栗子(运用TensorFlow解析图像)
- android studio导入工程版本问题
- [Android]Android布局优化之 ViewStub
- Android微信支付—注意事项
- Android支付宝SDK开发笔记
- [Android]Android布局优化之 merge
- Android驱动学习-Eclipse安装与配置
- Android微信支付SDK开发
- 在Android 中调用sqlite数据库