retrofit框架实现的这么巧妙,虽然我们不需要再造一个轮子,但研究下轮子的实现还是很有帮助的.
retrofit有几个关键的地方.
1.用户自定义的接口和接口方法.(由动态代理创建对象.)
2.converter转换器.(把response转换为一个具体的对象)
3.注解的使用.
让我们跟随Api来看吧.
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(API_URL).build();
build()其内部实现是这样的:
1
2
3
4
5
6
7
8
|
public
RestAdapter build() {
if
(endpoint ==
null
) {
throw
new
IllegalArgumentException(
"Endpoint may not be null."
);
}
ensureSaneDefaults();
return
new
RestAdapter(endpoint, clientProvider, httpExecutor, callbackExecutor,
requestInterceptor, converter, profiler, errorHandler, log, logLevel);
}
|
当用户没有设置自定义的converter,client, httpExecutor(http访问执行的线程-->只对异步的retrofit有效.), callBackExecutor(异步的callBack执行的线程), errorHandler, log, RequestInterceptor的时候,就会使用retrofit默认的配置.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
private
void
ensureSaneDefaults() {
if
(converter ==
null
) {
converter = Platform.get().defaultConverter();
}
if
(clientProvider ==
null
) {
clientProvider = Platform.get().defaultClient();
}
if
(httpExecutor ==
null
) {
httpExecutor = Platform.get().defaultHttpExecutor();
}
if
(callbackExecutor ==
null
) {
callbackExecutor = Platform.get().defaultCallbackExecutor();
}
if
(errorHandler ==
null
) {
errorHandler = ErrorHandler.DEFAULT;
}
if
(log ==
null
) {
log = Platform.get().defaultLog();
}
if
(requestInterceptor ==
null
) {
requestInterceptor = RequestInterceptor.NONE;
}
}
}
|
Platform.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
private
static
final
Platform PLATFORM = findPlatform();
static
Platform get() {
return
PLATFORM;
}
private
static
Platform findPlatform() {
try
{
Class.forName(
"android.os.Build"
);
//只要android.os.Build的class可以正常找到,证明是在android平台
if
(Build.VERSION.SDK_INT !=
0
) {
return
new
Android();
}
}
catch
(ClassNotFoundException ignored) {
}
if
(System.getProperty(
"com.google.appengine.runtime.version"
) !=
null
) {
return
new
AppEngine();
//google的app Engine平台
}
return
new
Base();
}
|
retrofit的Android类继承了Platform, 根据android的特性对配置项做了处理.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
private
static
class
Android
extends
Platform {
@Override
Converter defaultConverter() {
return
new
GsonConverter(
new
Gson());
//默认的转换器是Gson
}
@Override
Client.Provider defaultClient() {
final
Client client;
if
(hasOkHttpOnClasspath()) {
//有okhttp的路径就使用 Okhttp
client = OkClientInstantiator.instantiate();
}
else
if
(Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) {
client =
new
AndroidApacheClient();
//没有okhttp,且版本小于2.3 使用HttpClient
}
else
{
client =
new
UrlConnectionClient();
//没有okhttp,且版本大于等于2.3 使用urlConnection.
}
return
new
Client.Provider() {
@Override
public
Client get() {
return
client;
}
};
}
@Override
Executor defaultHttpExecutor() {
//网络访问执行的线程.
return
Executors.newCachedThreadPool(
new
ThreadFactory() {
//一个cached的线程池.可以复用老线程且线程长时间不用会自动回收. 线程池中线程不够会生成新线程.
@Override
public
Thread newThread(
final
Runnable r) {
return
new
Thread(
new
Runnable() {
@Override
public
void
run() {
Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND);
//设置线程的优先级 为最低
r.run();
}
}, RestAdapter.IDLE_THREAD_NAME);
}
});
}
@Override
Executor defaultCallbackExecutor() {
//异步执行的线程.
return
new
MainThreadExecutor();
}
@Override
RestAdapter.Log defaultLog() {
//通过Log.d("Retrofit",String)打印log
return
new
AndroidLog(
"Retrofit"
);
}
}
|
1
2
3
4
5
6
7
8
|
private
static
boolean
hasOkHttpOnClasspath() {
try
{
Class.forName(
"com.squareup.okhttp.OkHttpClient"
);
//是否可以找到OkHttpClient类.
return
true
;
}
catch
(ClassNotFoundException ignored) {
}
return
false
;
}
|
可以发现上面默认的Http的Executor是一个线程池.
而CallBack的Executor是在主线程执行的. 由绑定MainLooper的Handler提交到主线程执行.
1
2
3
4
5
6
7
|
public
final
class
MainThreadExecutor
implements
Executor {
private
final
Handler handler =
new
Handler(Looper.getMainLooper());
//关联主线程的Handler
@Override
public
void
execute(Runnable r) {
handler.post(r);
//提交到主线程执行
}
}
|
1
2
3
4
|
public
final
boolean
post(Runnable r)
{
return
sendMessageDelayed(getPostMessage(r),
0
);
}
|
1
2
3
4
5
|
private
static
Message getPostMessage(Runnable r) {
//把runnable封装到Message中.
Message m = Message.obtain();
m.callback = r;
return
m;
}
|