真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Retrofit源碼的示例分析-創(chuàng)新互聯(lián)

這篇文章主要介紹了Retrofit源碼的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

目前累計(jì)服務(wù)客戶千余家,積累了豐富的產(chǎn)品開發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹立企業(yè)形象,為客戶提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。成都創(chuàng)新互聯(lián)始終以務(wù)實(shí)、誠(chéng)信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過對(duì)領(lǐng)先技術(shù)的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究、對(duì)客戶形象的視覺傳遞、對(duì)應(yīng)用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。

基本使用介紹

介紹源碼前,我們先看下Retrofit的基本使用,大致了解下流程,跟著這個(gè)流程來分析源碼才不會(huì)亂。

1、初始化Retrofit對(duì)象

Retrofit retrofit = new Retrofit.Builder()
    //使用自定義的mGsonConverterFactory
    .addConverterFactory(GsonConverterFactory.create())
    .baseUrl("http://apis.baidu.com/txapi/")
    .build();

2、定義接口

public interface APi {

  @GET("hello/world")
  Call getNews(@Query("num") String num,@Query("page")String page);
}

3、發(fā)起網(wǎng)絡(luò)請(qǐng)求

mApi = retrofit.create(APi.class);
Call news = mApi.getNews("1", "10");
news.enqueue(new Callback() {
  @Override
  public void onResponse(Call call, Response response) {

  }

  @Override
  public void onFailure(Call call, Throwable t) {

  }
});

Retrofit本質(zhì)分析

看到上面的整個(gè)流程,不去探究源碼的話肯定一臉懵逼,我就定義了一個(gè)接口,指定了下返回值,為毛這個(gè)接口就可以直接用了?接口的實(shí)現(xiàn)呢?我隨便寫一個(gè)返回值,不指定返回Call行不行?待著這些疑問,我們大致也可以猜出Retrofit是干什么的了。

猜測(cè):Retrofit主要就是為我們定義的接口創(chuàng)造了一個(gè)實(shí)例,然后這個(gè)實(shí)例調(diào)用接口中的方法將我們定義在注解中的值拼裝成發(fā)起http請(qǐng)求所要的信息,最后利用這些信息產(chǎn)生一個(gè)我們?cè)诮涌诜祷刂抵幸?guī)定的對(duì)象,這個(gè)對(duì)象可以用來發(fā)起真正的請(qǐng)求。
簡(jiǎn)單的講,Retrofit就是把注解中的東西拼成http請(qǐng)求的對(duì)象,然后由這個(gè)對(duì)象去發(fā)起請(qǐng)求。

驗(yàn)證猜測(cè)

是誰實(shí)現(xiàn)了這個(gè)接口

發(fā)起網(wǎng)絡(luò)請(qǐng)求時(shí),有這樣一句:

mApi = retrofit.create(APi.class);

很明顯,接口的實(shí)現(xiàn)應(yīng)該是這個(gè)create干的事,我們跟進(jìn)去看看源碼:

 public  T create(final Class 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 serviceMethod =
        (ServiceMethod) loadServiceMethod(method);
      OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
      return serviceMethod.adapt(okHttpCall);
     }
    });
 }

這里我們不用去看一些細(xì)節(jié),只去關(guān)注我們想知道的,這個(gè)Create方法到底干了什么,看到Proxy.newProxyInstance,哦!這就很明顯了,這里接口之所以能夠直接調(diào)用是使用了動(dòng)態(tài)代理技術(shù),產(chǎn)生了一個(gè)代理對(duì)象。binggo,一個(gè)問題解決?。?!

什么時(shí)候開始將注解中參數(shù)拼裝成http請(qǐng)求的信息的?

動(dòng)態(tài)代理是干什么的?(大家最好單獨(dú)去學(xué)習(xí)下Java的動(dòng)態(tài)代理,有時(shí)候非常有用,資料網(wǎng)上大把大把的)
使用動(dòng)態(tài)代理一般是為了攔截方法,好在個(gè)方法執(zhí)行的時(shí)候,在執(zhí)行之前或之后干些自己的事情。這里回顧下Retrofit的使用,通過Create方法產(chǎn)生代理對(duì)象后直接就調(diào)用定義的方法了。那么,所有的小動(dòng)作必然是在調(diào)用接口方法的時(shí)候干的。具體就是invoke中的方法

  if (method.getDeclaringClass() == Object.class) {
       return method.invoke(this, args);
      }
      if (platform.isDefaultMethod(method)) {
       return platform.invokeDefaultMethod(method, service, proxy, args);
      }
      ServiceMethod serviceMethod =
        (ServiceMethod) loadServiceMethod(method);
      OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
      return serviceMethod.adapt(okHttpCall);

前兩個(gè)if判斷主要是為了跳過object和object中內(nèi)置的一些方法,除了這些,剩下的所有方法必然是我們?cè)诮涌谥卸x的,也就是我們要攔截的。那么真正干事的就是三句:

ServiceMethod serviceMethod =
        (ServiceMethod) loadServiceMethod(method);
      OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
      return serviceMethod.adapt(okHttpCall);

其中l(wèi)oadServiceMethod()方法就是用來拼裝http請(qǐng)求信息的,這個(gè)問題解決!

如何產(chǎn)生發(fā)起http請(qǐng)求對(duì)象的?

經(jīng)過上面的分析, OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);這就很明顯就是用來生產(chǎn)這個(gè)對(duì)象的。

如何將對(duì)象轉(zhuǎn)換成我們?cè)诮涌谥兄付ǖ姆祷刂档模?/p>

這里要說明下,之前我們定義接口的時(shí)候是這樣的:

@GET("hello/world")
  Call getNews(@Query("num") String num,@Query("page")String page);

這里的Call和Okhttp的Call其實(shí)很像,其實(shí)連方法都幾乎一樣,但是Retrofit和Rxjava一起用的時(shí)候又可以這樣定義

@GET("book/search")
  Observable getSearchBook(@Query("q") String name,
                  @Query("tag") String tag, @Query("start") int start,
                  @Query("count") int count);

這里指定的返回值不再是Call,而是變成了RxJava的Observable,所以這里肯定有一步轉(zhuǎn)換,能將之前拼裝的信息轉(zhuǎn)換成我們指定的對(duì)象,具體核心就是最后一行的serviceMethod.adapt()干的。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Retrofit源碼的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!


網(wǎng)頁題目:Retrofit源碼的示例分析-創(chuàng)新互聯(lián)
文章分享:http://weahome.cn/article/iiehg.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部