Skip to content

Commit a88f03d

Browse files
author
zonda
committed
retrofit library description
1 parent ec841d2 commit a88f03d

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

retrofit/README.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# Retrofit(初稿)
2+
## 1、什么是Retrofit?
3+
## 2、常用示例
4+
## 3、动态代理
5+
## 4、使用场景
6+
## 5、结语
7+
***
8+
## 1、什么是Retrofit?
9+
按照 [官方文档](http://square.github.io/retrofit/), Retrofit 是用于 Android 或 Java [REST](http://zh.wikipedia.org/wiki/REST) 客户端的一个类型安全的框架。换句话说,Retrofit 是一个通过 Java 动态代理,针对 REST API 实现的网络请求框架,将 REST API 转化为 Java 的接口。
10+
***
11+
## 2、常用示例
12+
Retrofit 的使用较为简单,以 RetrofitDemo为例,Retrofit 首先,需要实现一个接口 OpenWeatherApiService,其中每个方法对应一个 API,通过设置返回值类型和是否有 Callback 回调,告知 Retrofit 是否需要异步请求;然后,创建一个 RestAdapter 用于动态生成对应接口 OpenWeatherApiService 的一个实例;最后,使用该实例请求服务器数据。
13+
14+
15+
根据接口设置的返回值类型和参数,Retrofit 的接口方法可分为 3 类,以 OpenWeatherApiService 中的方法为例:
16+
17+
18+
- “同步”请求,无 Callback 回调,有返回值
19+
20+
21+
```java
22+
@GET("/history/city")
23+
public WeatherHistoryResult getHistoryWeather(@Query("q") String queryInfo);
24+
```
25+
- “异步”请求,有 Callback 回调,无返回值
26+
27+
28+
```java
29+
@GET("/weather")
30+
public void getTodayWeather(@Query("q") String queryInfo, @Query("lang") String language,
31+
Callback<WeatherTodayResult> callback);
32+
```
33+
- “RxJava”请求,无 Callback 回调,有返回值,且返回值为 Observable 类型,***此时,工程必须包含 [rxjava-core.jar](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.netflix.rxjava%22%20AND%20a%3A%22rxjava-core%22)***
34+
```java
35+
@GET("/weather")
36+
public Observable<WeatherTodayResult> getTodayWeather(@QueryMap Map<String, String> params);
37+
```
38+
## 3、动态代理
39+
40+
41+
动态代理即通过实现 InvocationHandler 接口创建自己的调用处理器,同时为Proxy指定 ClassLoader 对象和一组接口来创建动态代理类,Retrofit 的核心便是 Java 的动态代理。实现动态代理有两种方式,代码如下:
42+
43+
44+
```java
45+
(T)Proxy.newProxyInstance(T.class.getClassLoader(),new Class[]{T.class}),new InvocationHanlder());
46+
```
47+
48+
49+
```java
50+
Class proxyClass = Proxy.getProxyClass(T.class.getClassLoader(), new Class[]{T.class});
51+
InvocationHandler handler = new InvocationHanlder();
52+
(T)proxyClass.getConstructor(new Class[]{InvactionHandler.class}).newInstance(new Object[]{handler});
53+
```
54+
## 4、使用场景
55+
56+
57+
Retrofit 通过动态代理很好的实现了网络请求和UI的解耦,但是作为一个库他并未提供网络数据存储的部分,对于线程控制也未做过多的优化,因此如有以上需求的项目可能就需要自行扩展相应的功能。此外,对于 [RxJava](https://github.com/Netflix/RxJava/wiki) 是 Netflix 编写的一个库,主要用于改进下载序列的回调时的嵌套带来的麻烦。因此,个人觉得若不是有一个相互关联的任务集合,则无使用 RxJava 的必要。
58+
59+
60+
## 5、结语
61+
62+
以上仅仅是关于 Retrofit 的一个基本介绍,关于 [RxJava](https://github.com/Netflix/RxJava/wiki)[OkHttp](http://square.github.io/okhttp/) 等相关内容并不在本文范围之内,因此未做过多介绍,如有遗漏或错误请多多指正。
63+

0 commit comments

Comments
 (0)