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; } |