1.創(chuàng)建retrofit 對象
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl("http://gank.io/api/")
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJavaCallAdapterFactory)
.build();
2.Builder 介紹
- builder 是用來初始化配置參數(shù)的內(nèi)部類
- builder 是采用建造者設(shè)計模式
- 在build() 方法調(diào)用之前必須調(diào)用baseUrl 方法,其他方法都是可選的
builder 成員變量
1. Platform: retrofit 執(zhí)行的的系統(tǒng)環(huán)境偎血,通過findPlatform方法獲取是不是是android環(huán)境
2. okhttp3.Call.Factory :生成請求的工廠類黔衡,默認為okHttpClient
3. baseUrl :HttpUrl 的請求地址
4. List<Converter.Factory> converterFactories:將實體類對象轉(zhuǎn)換成http 傳輸?shù)膶ο蟾浜睿蛘邔ttp 對象轉(zhuǎn)換成實體類對象
5. List<CallAdapter.Factory> adapterFactories :將返回結(jié)果生成指定的類型包裝對象
3.創(chuàng)建請求
//創(chuàng)建api 類
public interface GankApi {
@GET("data/福利/{number}/{page}")
Observable<GankBeautyResult> getBeauties(@Path("number") int number, @Path("page") int page);
}
創(chuàng)建api類的請求接口實體類
retrofit.create(GankApi.class);
create方法介紹:
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, @Nullable 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<Object, Object> serviceMethod =
(ServiceMethod<Object, Object>) loadServiceMethod(method);
OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
- 其內(nèi)部使用了動態(tài)代理來實現(xiàn)
ServiceMethod
- 主要用于處理request 和 response 并將其適配成通過的請求格式
- 采用了適配器模式,其創(chuàng)建成本很高颓遏,所以retrofit 用一個ConcurrentHashMap serviceMethodCache 來保存,網(wǎng)絡請求需要注意并發(fā)。
ServiceMethod<Object, Object> serviceMethod =
(ServiceMethod<Object, Object>) loadServiceMethod(method);
ServiceMethod<?, ?> loadServiceMethod(Method method) {
ServiceMethod<?, ?> result = serviceMethodCache.get(method);
if (result != null) return result;
synchronized (serviceMethodCache) {
result = serviceMethodCache.get(method);
if (result == null) {
result = new ServiceMethod.Builder<>(this, method).build();
serviceMethodCache.put(method, result);
}
}
return result;
}
serviceMethod.callAdapter.adapt(okHttpCall)
- 這段代碼主要作用是請求易阳,并返回固定的格式結(jié)果
@Override public Object adapt(Call<R> call) {
Observable<Response<R>> responseObservable = isAsync
? new CallEnqueueObservable<>(call)
: new CallExecuteObservable<>(call);
Observable<?> observable;
if (isResult) {
observable = new ResultObservable<>(responseObservable);
} else if (isBody) {
observable = new BodyObservable<>(responseObservable);
} else {
observable = responseObservable;
}
if (scheduler != null) {
observable = observable.subscribeOn(scheduler);
}
if (isFlowable) {
return observable.toFlowable(BackpressureStrategy.LATEST);
}
if (isSingle) {
return observable.singleOrError();
}
if (isMaybe) {
return observable.singleElement();
}
if (isCompletable) {
return observable.ignoreElements();
}
return observable;
}
代理模式
靜態(tài)代理
主要思路 代理類持有realsubject 對象,可以對相關(guān)操作進行攔截吃粒。
實例代碼如下:
public interface IRunner {
//運動員的主要工作就是跑步
public void run();
}
public class Runner implements IRunner {
public void run() {
System.out.println("運動員跑步: 動作很瀟灑");
}
}
public class RunnerAgent implements IRunner {
private IRunner runner;
public RunnerAgent(IRunner _runner){
this.runner = _runner;
}/
/代理人是不會跑的
public void run() {
Random rand = new Random();
if(rand.nextBoolean()){
System.out.println("代理人同意安排運動員跑步");
runner.run();
}else{
System.out.println("代理人心情不好潦俺, 不安排運動員跑步");
}
}
}
動態(tài)代理
動態(tài)生成對象,可以代理方法
InvocationHandler
- 產(chǎn)生一個對象的代理對象
- 代理對象在方法被調(diào)用的時候被觸發(fā)
- 主要場景:面向切面編程
public class GamePlayIH implements InvocationHandler {
//被代理者
Class cls =null;
//被代理的實例
Object obj = null;
//我要代理誰
public GamePlayIH(Object _obj){
this.obj = _obj;
}
//調(diào)用被代理的方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = method.invoke(this.obj, args);
return result;
}
}
public class Client {
public static void main(String[] args) throws Throwable {
//定義一個癡迷的玩家
IGamePlayer player = new GamePlayer("張三");
//定義一個handler
InvocationHandler handler = new GamePlayIH(player);
//開始打游戲, 記下時間戳
System.out.println("開始時間是: 2009-8-25 10:45");
//獲得類的class loader
ClassLoader cl = player.getClass().getClassLoader();
//動態(tài)產(chǎn)生一個代理者
IGamePlayer proxy = (IGamePlayer)Proxy.newProxyInstance(cl,new Class[]{GamePlayer.class},handler);
//登錄
proxy.login("zhangSan", "password");//開始殺怪
proxy.killBoss();
//升級
proxy.upgrade();
//記錄結(jié)束游戲時間
System.out.println("結(jié)束時間是: 2009-8-26 03:40");
}
}