【Android】Retrofit 2.0 的使用

一、概述

Retrofit是Square公司開發的一個類型安全的Java和Android 的REST客戶端庫。來自官網的介紹:

A type-safe?HTTP client?for Android and Java
  • Rest API是一種軟件設計風格,服務器作為資源存放地。客戶端去請求GET,PUT, POST,DELETE資源。并且是無狀態的,沒有session的參與。關于REST的介紹可以參考維基百科
  • retrofit模型如下:(來自如何使用Retrofit寫一個Android的REST客戶端的小教程)

retrofit模型
1)?POJO或模型實體類?: 從服務器獲取的JSON數據將被填充到這種類的實例中。
2)?接口?: 我們需要創建一個接口來管理像GET,POST...等請求的URL,這是一個服務類。
3)?RestAdapter類?: 這是一個REST客戶端(RestClient)類,retrofit中默認用的是Gson來解析JSON數據,你也可以設置自己的JSON解析器。

二、原理

在發起請求時,整個框架主要通過Call來封裝每一次的請求。
調用同步方法時,會使用應用線程來發送請求;
調用異步方法時會通過 OkHttp 的 Dispatcher 提供的線程來執行請求。

Dispatcher:Dispatcher內部實現了懶加載無邊界限制的線程池方式,同時該線程池采用了SynchronousQueue這種阻塞隊列。SynchronousQueue每個插入操作必須等待另一個線程的移除操作,同樣任何一個移除操作都等待另一個線程的插入操作。顯然這是一種快速傳遞元素的方式,也就是說在這種情況下元素總是以最快的方式從插入者(生產者)傳遞給移除者(消費者),這在多任務隊列中是最快處理任務的方式。

二、使用

添加依賴(gradle)或導jar包

添加依賴
在modul的build文件下的dependencies中添加

compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'

點擊Sync Now
(或)導jar包,點擊下載
retrofit-2.0.0-beta2.jar|????????????????Retrofit庫
converter-gson-2.0.0-beta2_.jar?| ?? Gson解析庫
gson-2.4.jar?????????????|????????????????????????Gson解析庫
okhttp-2.5.0.jar? ????????????|???????????????????Okhttp請求庫
okio-1.6.0.jar?????????????|???????????????????????Okhttp請求庫
說明:
Retrofit依賴于okhttp,所以需要集成okhttp
API返回的數據為JSON格式,在此我使用的是Gson對返回數據解析

添加權限

由于是網絡請求,需要在manifest中添加網絡請求的權限

<uses-permission android:name="android.permission.INTERNET"/>

創建實體類

這是使用Gson解析,需要創建一個POJO(Java對象)。服務器返回的JSON數據不能在Java里直接使用,所以我們需要用模型類來做轉換。這里使用jsonschema2pojo(需翻墻)來創建POJO。
得到JSON數據如下:
JSON數據
復制JSON字符串到輸入框中,填寫報名、類名,源代碼類型選擇JSON,注解類型選擇Gson,點擊Preview即可得到對應的POJO,如下圖
復制到jsonschema2pojo中
點擊preview,得到對應的實體類。將其拷貝到自己的工程中即可。
得到的實體類

import?com.google.gson.annotations.SerializedName;
@Generated("org.jsonschema2pojo")
可刪除

POJO的轉換推薦使用GsonFormat,用法不就不說了,自己去搜吧。簡單易用

創建一個Retrofit?對象(核心用法一)

Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())//解析方法//這里建議:- Base URL: 總是以/結尾;- @Url: 不要以/開頭.baseUrl("http://www.wangyinews.com.cn/").build();

接口申明(核心用法二)

public interface NewsService {/*** 根據newsid獲取對應的資訊數據* 如果不需要轉換成Json數據,可以用了ResponseBody;* @param newsId* @return call*/@GET("News/{newsId}")Call<News> getNews(@Path("newsId") String newsId);
}

若需要重新定義接口地址可以使用@Url,例:

    @GETCall<List<CaigenActivitySubjectsBean>> getActivitySubjectsList(@Url String url,@QueryMap Map<String, String> map);
更多請求方法請參考:Retrofit網絡請求Service,@Path、@Query、@QueryMap
  • 創建訪問API的請求(核心用法三)
NewsService api = retrofit.create(NewsService .class);
Call<News> call = service.getNews("123456");

同步調用(核心用法四)

News news = call.execute();

異步調用(核心用法五)

call.enqueue(new?Callback<News>(){??@Override??public?void?onResponse(Response<News>?response)?{??//成功返回數據后在這里處理,使用response.body();獲取得到的結果News news = response.body();}??@Override??public?voidonFailure(Throwable?t)?{??//請求失敗在這里處理??}??});??

取消請求(核心用法六)

call.cancel();??

完成以上步驟就可以實現一個簡單的網絡請求了。

Tips:
當返回結果錯誤,調用response.errorBody().string();可以得到String類型的請求結果,但再次調用response.errorBody().string();得到的結果為""。具體原因不明

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388221.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個透明的shader

楊航最近在學Unity3D&#xfeff;&#xfeff;Shader "Custom/xiankuang" { Properties { _LineColor ("Line Color", Color) (1,1,1,1) _GridColor ("Grid Color", Color) (1,1,1,0) _LineWidth ("Line Width", float) 0…

Mysql常用命令(二)

對數據庫的操作 增 create database db1 charset utf8; 查 # 查看當前創建的數據庫 show create database db1; # 查看所有的數據庫 show databases; 改 alter database db1 charset gbk; 刪 drop database db1; 對表的操作 use db1; #切換文件夾select database(); #查看當前所…

python中定義數據結構_Python中的數據結構—簡介

python中定義數據結構You have multiples algorithms, the steps of which require fetching the smallest value in a collection at any given point of time. Values are assigned to variables but are constantly modified, making it impossible for you to remember all…

1206封裝電容在物料可靠性設計比較低

1206封裝電容在物料可靠性設計中是要盡力避免的&#xff0c;盡量選擇0805或1210。在現場中容易出現電容因斷裂而擊穿的情況。同時容易造成保險絲燒斷。轉載于:https://www.cnblogs.com/conglinlixian/p/10414877.html

Java開發中 Double 和 float 不能直接運算

不能直接運算 是因為計算機儲存浮點類型的數值使用指數和尾數來表示 這就意味著計算時會出現“精度缺失”的現象 為了解決這個問題 我們引入 java.math.BigDecimal類來進行精確計算。 具體如下&#xff1a; public class Arith { //加法運算 public static double add(dou…

Unity3D 場景與C# Control進行結合

楊航最近在自學Unity3D&#xff0c;打算使用這個時髦、流行、強大的游戲引擎開發一個三維業務展示系統&#xff0c;不過發現游戲的UI和業務系統的UI還是有一定的差別&#xff0c;很多的用戶還是比較習慣WinForm或者WPF中的UI形式&#xff0c;于是在網上搜了一下WinForm和Unity3…

數據質量提升_合作提高數據質量

數據質量提升Author Vlad Ri?cu?ia is joined for this article by co-authors Wayne Yim and Ayyappan Balasubramanian.作者 Vlad Ri?cu?ia 和合著者 Wayne Yim 和 Ayyappan Balasubramanian 共同撰寫了這篇文章 。 為什么要數據質量&#xff1f; (Why data quality?) …

黑魔法(method-swizzling)解決第三方庫引發的問題

需求 最近做一個項目中&#xff0c;有個需求&#xff0c;所有網絡請求&#xff0c;都不顯示 NetworkActvityIndicator&#xff08;也就是狀態欄里旋轉的小圈圈&#xff09;. 解決過程1&#xff1a; 全局搜索 NetworkIndicator 關鍵字&#xff0c; 把所有涉及 NetworkIndicator …

Python 操作 MySQL 的5種方式(轉)

Python 操作 MySQL 的5種方式 不管你是做數據分析&#xff0c;還是網絡爬蟲&#xff0c;Web 開發、亦或是機器學習&#xff0c;你都離不開要和數據庫打交道&#xff0c;而 MySQL 又是最流行的一種數據庫&#xff0c;這篇文章介紹 Python 操作 MySQL 的5種方式&#xff0c;你可以…

unity3d 人員控制代碼

普通瀏覽復制代碼private var walkSpeed : float 1.0;private var gravity 100.0;private var moveDirection : Vector3 Vector3.zero;private var charController : CharacterController;function Start(){charController GetComponent(CharacterController);animation.w…

刪除wallet里面登機牌_登機牌丟失問題

刪除wallet里面登機牌On a sold-out flight, 100 people line up to board the plane. The first passenger in the line has lost his boarding pass but was allowed in regardless. He takes a random seat. Each subsequent passenger takes their assigned seat if availa…

PHP 備份還原 MySql 數據庫

原生 PHP 備份還原 MySql 數據庫 支持 MySql&#xff0c;PDO 兩種方式備份還原 php5.5 以上的版本建議開啟pdo擴展&#xff0c;使用 pdo 備份還原數據 備份文件夾 db_backup、import/log 文件要有讀寫權限環境版本 本人測試環境 php:5.5.38 /5.6.27-nts/7.0.12-nts; mysql: 5.5…

Java? 教程(Queue接口)

Queue接口 Queue是在處理之前保存元素的集合&#xff0c;除了基本的Collection操作外&#xff0c;隊列還提供額外的插入、刪除和檢查操作&#xff0c;Queue接口如下。 public interface Queue<E> extends Collection<E> {E element();boolean offer(E e);E peek();…

字符串操作截取后面的字符串_對字符串的5個必知的熊貓操作

字符串操作截取后面的字符串We have to represent every bit of data in numerical values to be processed and analyzed by machine learning and deep learning models. However, strings do not usually come in a nice and clean format and require preprocessing to con…

最新 Unity3D鼠標滑輪控制物體放大縮小 [

var s 1.0;function Update () {var cube GameObject.Find("Cube");if(Input.GetAxis("Mouse ScrollWheel")){s Input.GetAxis("Mouse ScrollWheel");cube.transform.localScaleVector3(1*s,1*s,1*s);}}

sublime-text3 安裝 emmet 插件

下載sublime&#xff0c;http://www.sublimetext.com/ 安裝package control &#xff1a;https://packagecontrol.io/ins... 這個地址需要翻墻&#xff0c;訪問不了的可以看下圖 import urllib.request,os,hashlib; h 6f4c264a24d933ce70df5dedcf1dcaee ebe013ee18cced0ef93d…

數據科學家訪談錄 百度網盤_您應該在數據科學訪談中向THEM提問。

數據科學家訪談錄 百度網盤A quick search on Medium with the keywords “Data Science Interview” resulted in hundreds of Medium articles to help guide the reader from what concepts are covered to even specific company interviews ranging from Tesla, Walmart, …

unity3d]鼠標點擊地面人物自動走動(也包含按鍵wasdspace控制)

目錄(?)[-] 一效果圖二大概步驟 創建一個plane設置層為Terrain因為后面要判斷是否點擊的是這個層準備好人物模型并且將三個腳本拖放到人物上并且將動畫文件也拖放好記得看前面提醒哦 ThirdPersonCamera相當于smoothflowThirdPersonController修改版mouseMoveContr鼠標點擊人物…

uva 524(Prime Ring Problem UVA - 524 )

dfs練習題,我素數打表的時候ji了&#xff0c;一直沒發現實際上是ji*i&#xff0c;以后可記住了。還有最后一行不能有空格。。。昏迷了半天 我的代碼(紫書上的算法) #include <bits/stdc.h> using namespace std; int bk[110]; int num[110]; int vis[110]; int n; void d…

Web 開發基礎

一、 Web 開發簡介 最早的軟件都是運行在大型機上的&#xff0c;軟件使用者登陸到大型機上去運行軟件。后來隨著 PC 機的興起&#xff0c;軟件開始主要運行在桌面上&#xff0c;而數據庫這樣的軟件運行在服務器端&#xff0c;這種 Client/Server 模式簡稱 CS 架構。隨著互聯網的…