1. 程式人生 > >Android 網路開源庫之Retrofit

Android 網路開源庫之Retrofit

    當前的網路開源庫有許多,如volley,okhttp,retrofit等,這三個庫當前是比較火的,其中,okhttp和retrofit由square團隊開發。關於這三個庫的區別,請移步stackoverflow或者知乎檢視。開發過程中選擇什麼樣的開源庫需要更具我們APP來做出選擇。我們選出stackoverflow中的一段話來看下。

    \

    上面說,需要與web service通訊的時候,我們使用retrofit。百度百科 web service介紹,那麼我們見天就來了解下retrofit。

什麼是retrofit

    關於什麼是retrofit,官網文件上們有一句話。A type-safe HTTP client for Android and Java。額,似乎什麼也看出去來,就知道是一個型別安全的http client庫。那麼什麼是型別安全呢?型別安全程式碼指訪問被授權可以訪問的記憶體位置。例如,型別安全程式碼不能從其他物件的私有欄位讀取值。它只從定義完善的允許方式訪問型別才能讀取。型別安全的程式碼具備定義良好的資料型別。更多內容百度百科-型別安全,關於這裡還引用上面知乎的一句話。

      網路訪問框架經過了從使用最原始的AsyncTask構建簡單的網路訪問框架(甚至不能稱為框架),後來使用開源的Android-async-http庫,再到使用google釋出的volley庫,一直不懈的尋找更好的解決方案(銀彈),到現在雖然銀彈沒找到,也算找 到了一些更好的方案,在這裡做些記錄,也做共享。

目標架構如下圖:




Retrofit:Square提供的開源產品,為Android平臺的應用提供一個型別安全的REST客戶端

  1. https://github.com/square/retrofit  

RxAndroid:響應式程式設計框架RxJava針對Android平臺的擴充套件。

  1. https://github.com/ReactiveX/RxAndroid  
  2. https://github.com/ReactiveX/RxJava  

Dagger2:依賴注入(或叫ioc,用過spring的都知道這東東)框架,用於解耦的。

  1. https://github.com/google/dagger/  


前序:看到網上大牛的介紹上面這三個框架,自己也試著折騰折騰

以下示例通過 http://ip.taobao.com/service/getIpInfo.php?ip=21.22.11.33 獲取json資料。

先看看廬山真面目,大家看了也會說,醬紫啊,搜森破!




1、通過配置gradle配置將Retrofit框架引入專案。

  1. compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
  2. compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

2、編寫API服務程式碼

  1. package com.micky.retrofitrxandroiddagger2.data.api;  
  2. import com.micky.retrofitrxandroiddagger2.data.api.response.GetIpInfoResponse;  
  3. import retrofit.Call;  
  4. import retrofit.http.GET;  
  5. import retrofit.http.Query;  
  6. import rx.Observable;  
  7. /** 
  8.  * @Project retrofitrxandroiddagger2 
  9.  * @Packate com.micky.retrofitrxandroiddagger2.data.api 
  10.  * @Description 
  11.  * @Author Micky Liu 
  12.  * @Email [email protected] 
  13.  * @Date 2015-12-21 17:22 
  14.  * @Version 1.0 
  15.  */
  16. publicinterface ApiService {  
  17.     @GET("service/getIpInfo.php")  
  18.     Call<GetIpInfoResponse> getIpInfo(@Query("ip") String ip);  
  19. }  

3、定義接收資料的response

  1. package com.micky.retrofitrxandroiddagger2.data.api.response;  
  2. import com.micky.retrofitrxandroiddagger2.data.api.model.IpInfo;  
  3. /** 
  4.  * @Project CommonProject 
  5.  * @Packate com.micky.commonproject.data.api.response 
  6.  * @Description 
  7.  * @Author Micky Liu 
  8.  * @Email [email protected] 
  9.  * @Date 2015-12-21 16:39 
  10.  * @Version 1.0 
  11.  */
  12. publicclass GetIpInfoResponse extends BaseResponse {  
  13.     public IpInfo data;  
  14. }  

4、請求資料並顯示

  1. package com.micky.retrofitrxandroiddagger2;  
  2. import android.os.Bundle;  
  3. import android.support.design.widget.FloatingActionButton;  
  4. import android.support.v7.app.AppCompatActivity;  
  5. import android.support.v7.widget.Toolbar;  
  6. import android.view.View;  
  7. import android.view.Menu;  
  8. import android.view.MenuItem;  
  9. import android.widget.ProgressBar;  
  10. import android.widget.TextView;  
  11. import android.widget.Toast;  
  12. import com.micky.retrofitrxandroiddagger2.common.utils.CrashHandler;  
  13. import com.micky.retrofitrxandroiddagger2.data.api.ApiService;  
  14. import com.micky.retrofitrxandroiddagger2.data.api.response.GetIpInfoResponse;  
  15. import retrofit.Call;  
  16. import retrofit.Callback;  
  17. import retrofit.GsonConverterFactory;  
  18. import retrofit.Response;  
  19. import retrofit.Retrofit;  
  20. import retrofit.RxJavaCallAdapterFactory;  
  21. import rx.Subscriber;  
  22. import rx.android.schedulers.AndroidSchedulers;  
  23. import rx.functions.Action1;  
  24. import rx.schedulers.Schedulers;  
  25. /** 
  26.  * @Project retrofitrxandroiddagger2 
  27.  * @Packate com.micky.retrofitrxandroiddagger2 
  28.  * @Description 
  29.  * @Author Micky Liu 
  30.  * @Email [email protected] 
  31.  * @Date 2015-12-21 17:35 
  32.  * @Version 1.0 
  33.  */
  34. publicclass MainActivity extends AppCompatActivity {  
  35.     privatestaticfinal String ENDPOINT = "http://ip.taobao.com";  
  36.     private TextView mTvContent;  
  37.     private ProgressBar mProgressBar;  
  38.     @Override
  39.     protectedvoid onCreate(Bundle savedInstanceState) {  
  40.         super.onCreate(savedInstanceState);  
  41.         setContentView(R.layout.activity_main);  
  42.         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);  
  43.         setSupportActionBar(toolbar);  
  44.         mTvContent = (TextView) findViewById(R.id.tv_content);  
  45.         mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);  
  46.         FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);  
  47.         fab.setOnClickListener(new View.OnClickListener() {  
  48.             @Override
  49.             publicvoid onClick(View view) {  
  50.                 Retrofit retrofit = new Retrofit.Builder()  
  51.                         .baseUrl(ENDPOINT)  
  52.                         .addConverterFactory(GsonConverterFactory.create())  
  53.                         .build();  
  54.                 ApiService apiService = retrofit.create(ApiService.class);  
  55.                 mProgressBar.setVisibility(View.VISIBLE);  
  56.                 Call<GetIpInfoResponse> call = apiService.getIpInfo("63.223.108.42");  
  57.                 call.enqueue(new Callback<GetIpInfoResponse>() {  
  58.                     @Override
  59.                     publicvoid onResponse(Response<GetIpInfoResponse> response, Retrofit retrofit) {  
  60.                         mProgressBar.setVisibility(View.GONE);  
  61.                         GetIpInfoResponse getIpInfoResponse = response.body();  
  62.                         mTvContent.setText(getIpInfoResponse.data.country);  
  63.                     }  
  64.                     @Override
  65.                     publicvoid onFailure(Throwable t) {  
  66.                         mProgressBar.setVisibility(View.GONE);  
  67.                         mTvContent.setText(t.getMessage());  
  68.                     }  
  69.                 });  
  70.             }  
  71.         });  
  72.     }  
  73.     @Override
  74.     publicboolean onCreateOptionsMenu(Menu menu) {  
  75.         getMenuInflater().inflate(R.menu.menu_main, menu);  
  76.         returntrue;  
  77.     }  
  78.     @Override
  79.     publicboolean onOptionsItemSelected(MenuItem item) {  
  80.         int id = item.getItemId();  
  81.         if (id == R.id.action_settings) {  
  82.             returntrue;  
  83.         }  
  84.         returnsuper.onOptionsItemSelected(item);  
  85.     }  
  86. }  

就這麼簡單,上述程式碼已經實現通過retrofit訪問restful api獲取資料並顯示。

下載地址:http://download.csdn.net/my

相關推薦

Android 網路開源Retrofit

    當前的網路開源庫有許多,如volley,okhttp,retrofit等,這三個庫當前是比較火的,其中,okhttp和retrofit由square團隊開發。關於這三個庫的區別,請移步stackoverflow或者知乎檢視。開發過程中選擇什麼樣的開源庫需要更具

Android網路開源-Retrofit(三) 批量上傳及上傳進度監聽

由於gif圖太大的原因,我將圖放在了github,如果部落格中顯示不出來圖,傳送門 由於我是事先寫在md上的,導致程式碼的可讀性差,大家將就著看吧。 1. 前言 在上一篇部落格中,我們介紹了Retrofit的檔案上傳,檔案下載以及進度監聽,這篇部落格

Android網路開源-Retrofit(二) 檔案上傳、下載及進度監聽

1.寫在前面的話 首先說明,我還沒太搞懂retrofit,目前,這篇部落格只能給出這幾個內容。 檔案上傳 檔案下載 檔案下載的進度監聽 還有這兩點沒弄好, 多檔案一次上傳 (批量上傳) 檔案上傳進度監聽 當前使用版本 compile 'com

Retrofit網路開源

 網路開源庫有很多,不過目前最為流行或者用到最多有三個volley、okhttp、retrofit不過博主個人感覺xutil也挺好的(具體用法我會在微信中推廣)  廢話不多說先上原始碼  原始碼連結   點選開啟連結  gith

Android技能樹 — 網路小結(7) Retrofit原始碼詳細解析

前言: 哈哈,其實寫的還是很水,各位原諒我O(∩_∩)O。 介於自己的網路方面知識爛的一塌糊塗,所以準備寫相關網路的文章,但是考慮全部寫在一篇太長了,所以分開寫,希望大家能仔細看,最好可以指出我的錯誤,讓我也能糾正。 1.講解相關的整個網路體系結構: Android技能樹 — 網路小結(1)之網路體系

Android開源使用ZXing開源生成二維碼及識別本地二維碼圖片

/** * 解析二維碼(使用解析RGB編碼資料的方式) * * @param path * @return */ public static Result decodeBarcodeRGB(String path) { if (Text

Android Viewpager開源

常見ViewPager 開源庫 名字 介紹 圖片 SwipeCardsView Android高仿秒拍熱榜的卡片滑動和左右飛出效果 image SCViewPag

Android常用開源的使用——————————————LitePal的使用方法

LitePal是一款開源Android資料庫框架,採用了物件關係對映的模式, 詳細的使用文件見LitePal專案的Github主頁 快速設定步驟: 1. Include library Edit your build.gradle file and add below dependency. If

Android常用開源———————————OkHttp的使用方法

OkHttp是一個優秀的網路通訊庫,GitHub專案主頁地址。   基本使用 在專案中中新增OkHttp庫的依賴。. implementation("com.squareup.okhttp3:okhttp:3.12.0")   OkHttp進行Get請求 //

開源EventBus使用詳解

簡介 EventBus是一種用於Android的釋出/訂閱事件匯流排。簡化了應用程式內各元件間、元件與後臺執行緒間的通訊。常用於Activity、Fragment和後臺Service之間通訊、傳

Android入門開源專案仿開眼視訊APP

開眼短視訊(OpenEyes) 仿照(開眼視訊)Android端(舊版UI,新版UI已改變)做的一個App,每天更新一個精美短視訊應用,一個非常美的短視訊應用,UI介面基本上是參照開眼視訊Android端來做的。 在該專案中,我採用的是Vitamio的視訊播放器框架

定製開源jar包和.so的引用

定製開源庫很多時候只是程式碼的開源,這次的要求是把jar包和.so檔案都放到庫裡,中間的過程還是有點曲折的。 首先我找到的是: 優雅的釋出Android開源庫(論JitPack的優越性) 本來我是按照這

Android常用開源專案,種類齊全,覆蓋面廣

宣告: 眾多開源庫出現的目的是為了不重複造輪子! 真正的高手切記,知其然,知其所以然!多花點時間,找主流的開源庫研究原始碼,成長更大!從中窺探掌握本質的技術和原理,萬變不離其宗! 推薦理由: 這份

C++跨平臺開源

本篇文章主要介紹了”C++開源庫集合 “,主要涉及到C++開源庫集合 方面的內容,對於C++開源庫集合 感興趣的同學可以參考一下。 mimetic A free/GPL C++ MIME Library mimetic is a free/GPL Email library (MIME) w

C++跨平臺開源

值得學習的C/C++語言開源專案 (1)ACE 龐大、複雜,適合大型專案。開源、免費,不依賴第三方庫,支援跨平臺。 (2)Asio Asio基於Boost開發的非同步IO庫,封裝了Socket,簡化基於socket程式的開發。 開源、免費,支援跨平臺。 (3)POCO POCO C++ Libr

Android 網路獲取資料Json解析

1.簡介 JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。 JSON資料作為目前網路中主流的資料傳輸格式之一,應用十分廣泛。 2. Json資料格式(兩種) Json資料有兩種格式: (1)物件 :物件表示

Android網路開發回顧旅 ① 在Android手機整合使用MQTT協議 ,實現搞掂移動控制硬體端。(附帶Demo)

一、認識MQTT協議。 如果你對MQTT協議的連線過程不熟悉,那沒關係;請看我前面的8266硬體上介紹的MQTT介紹 ,其實也沒啥難,這個MQTT的好處是短小,資訊傳遞快捷 ,適合在

Android材料設計摺疊式佈局你應該知道的一切

github原始碼地址:https://github.com/geduo83/AndroidMaterialDesign/tree/master/module_drawerlayout_coordinatorlayout 在Android5.0之後,Android給我們提供了非常豐富關於UI

Android 使用開源StickyGridHeaders來實現帶sections和headers的GridView顯示本地圖片效果

大家好!過完年回來到現在差不多一個月沒寫文章了,一是覺得不知道寫哪些方面的文章,沒有好的題材來寫,二是因為自己的一些私事給耽誤了,所以過完年的第一篇文章到現在才發表出來,2014年我還是會繼續在CSDN上面更新我的部落格,歡迎大家關注一下,今天這篇文章主要的是介紹下開源庫St

Android第三方開源:PopupWindow相關

MultiSelectPopWindow 效果圖 gradle allprojects { repositories { jcenter()