一個老程式猿的分享4

明媚的天發表於2017-11-04

一、寫在前面

  • 當這個 焦慮系列 進行到第四章,我更焦慮了。
  • 確實像一些業界良心大佬所說,幾乎每天都在想到底還要分享些什麼。
  • 上週沒有分享,不是不想,實在是工作已經讓我筋疲力盡,不過也很幸福,感覺收穫滿滿。
  • 本週發生了很多事,容我一一總結,一一道來。
  • 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

大家晚安。

本人微信,有興趣的,加一波
本人微信,有興趣的,加一波

相關文章