一、寫在前面
- 當這個 焦慮系列 進行到第四章,我更焦慮了。
- 確實像一些業界良心大佬所說,幾乎每天都在想到底還要分享些什麼。
- 上週沒有分享,不是不想,實在是工作已經讓我筋疲力盡,不過也很幸福,感覺收穫滿滿。
- 本週發生了很多事,容我一一總結,一一道來。
- Life is short, and professional life shorter still。
- 好吧,目標是技術文章,還是老套路分享一波技術。
二、進入正題
相信,在當今這個Android大環境下,如果你不會Retrofit或者RxJava, 你都不好意思出門。所以今天,簡單分享一下Retrofit+RxJava實現簡單的網路請求。
2.1 前言
- 本章講的 Retrofit 指的都是Retrofit2.0,關於具體如何入門,不在此章書寫範圍。
- 關於RxJava, 強力推薦扔物線老師的大作 給 Android 開發者的 RxJava 詳解,此文絕對值得你多讀兩遍。
- 程式碼部分只會粘關鍵部分,需要原始碼的同學可以在文章末加我微信。
2.2 封裝OkHttpClient物件
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(NetConifg.getCookieJar())
.addInterceptor(NetConfig.getInterceptor())
.connectTimeout(NetConfig.getConnectionTimeout(), TimeUnit.SECONDS)
.readTimeout(NetConfig.getReadTimeout(), TimeUnit.SECONDS)
.sslSocketFactory(NetConfig.getSslContext().getSocketFactory())
.hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
.build();複製程式碼
- OkHttpClient物件的建立相對比較簡單,不過我們可以將其封裝進工廠裡,從而達到複用的效果。
- 關於CookieJar、網路Interceptor、Https封裝,不在本章講解範圍之內,故一筆帶過。
- 網路Interceptor裡可以對請求頭部分進行設定,包括長連線、Authorization等。
2.3 封裝初始化方法
public static void init(String baseUrl) {
if (retrofit == null) {
synchronized (RetrofitHandler.class) {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl).client(client)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(JacksonConverterFactory.create(objectMapper))
.build();
}
}
}
}複製程式碼
- 可以看到其實就是使用單例模式生成了Retroift物件,需要傳入的引數只有url。
- 然後就是引入url、client、RxJava、Jackson解析庫。
2.4 封裝具體呼叫的方法
public static <T> T getService(final Class<T> service) {
T result = (T) serviceCache.get(service);
if (result == null) {
result = (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[]{service},
new InvocationHandler() {
T t = (T) retrofit.create(service);
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return ((Observable) Proxy.getInvocationHandler(t)
.invoke(t, method, args))
.compose(NetConfig.getThreadTransformer())
.flatMap(NetConfig.getServerErrorInterceptor());
}
});
serviceCache.put(service, result);
}
return result;
}複製程式碼
- 這個方法是我們以後網路請求常用的一個前置方法,其實就是根據傳入的介面的Class生成對應的物件。
- 這其中用到了巢狀的動態代理技術,感興趣的同學可以稍後加我微信溝通。
- 然後利用RxJava的compose操作符對執行緒轉換進行了封裝,利用flatMap操作符對server返回的錯誤碼進行了自定義封裝。
2.5 具體使用
終於到了實戰了,還真是有點小激動呢。好吧,沒啥好激動的。。。
- 初始化,一般在Application裡進行即可
NetManager.init("http://192.168.9.23:90/apps-server/");複製程式碼
- 定義介面,使用RxJava的Observable作為返回的類別。
public interface BlogService { @GET(NetConfig.GET_BLOG) Observable<JsonResult<List<Blog>>> getAllBlog(@Query("userId") String userId); }複製程式碼
呼叫介面
NetManager.getService(BlogService.class).getAllBlog(userId) .subscribe(new Subscriber<JsonResult<MsgThruOF>>() { @Override public void onStart() { super.onStart(); //做一些準備工作 } @Override public void onNext(List<String> strings) { //對具體請求到的資料做處理 } @Override public void onCompleted() { } @Override public void onError(Throwable e) { } });複製程式碼
- 配合RxJava呼叫介面非常的方便,而且完全是鏈式程式設計,程式碼結構看起來也很舒服。
- 這裡針對Subscriber類還可以進行進一步的封裝,平常用到最多的方法其實就是onNext()和onError()。
- 到這,一個基於Retrofit+RxJava的簡單網路請求框架已經搭建完畢,其中省略了不少簡易程式碼部分,相信大家基本都看懂了。
- 好吧,這次多加一個章節的部分,相信大家可以收穫更多。
三、分享部分
今天首先推薦三個公眾號,感興趣的同學,希望大家一起學習,一起成長。
提前宣告:這三個公眾號跟我半毛錢關係都沒有,純屬義務推廣。
3.1 碼農每日一題
- 也許每天只需要花費幾分鐘時間,你就可以掌握一個技術面試知識點。
- 而且,更重要的是,馬上就要推出針對Android的每日一題了。
- 請相信,堅持的力量。
3.2 老馬說程式設計
- 從入門到高階、深入淺出,帶你領略程式設計和計算機技術的本質。
3.3 碼農翻身
- 作者有15年的IBM架構師經驗,以戲謔的方式帶你走進計算機的世界。
四、最後
- 很多事情,確實是開頭最難,所以永遠不要停下腳步。我們還年輕,我們在路上。
- 熟悉我的朋友,可能瞭解我,到這了,怎麼也會扯回到焦慮這個話題上。
- LPL再次喪失總決賽的參賽資格,讓不少人覺得青春總是不完美的,亦如當年的納什。
- 不過,也有朋友告訴我LPL可以再堅持一年。因為明年,大魔王faker要去服兵役了。我的天,好吧,我還能說啥。
- 不過今天的三星真的打的好,提前打哭了faker,原來不止是我們的青春不完美,還有大魔王的。
- 一個 小學妹母親 出了車禍,作為朋友的我們其實真的幫不了啥,希望 好心人 能多一些吧!
- 自己的母親好像真的老了,自己好像越來越適應單身的生活。
- 喜歡的人也越來越少了。。。
- 最後的最後,還是忍不住推薦一篇面經好文 How I interviewed for 5 top companies in 5 days and got job offers from all of them 。