亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Retrofit全攻略——基礎篇

2019-11-09 16:12:25
字體:
來源:轉載
供稿:網友

實際開發過程中一般都會選擇一些網絡框架提升開發效率。隨著Google對HttpClient 摒棄和Volley框架的逐漸沒落,OkHttp開始異軍突起,而Retrofit則對OkHttp進行了強制依賴,可以簡單理解Retroifit在OKHttp基礎上進一步完善。

Retrofit是由Square公司出品的針對于Android和java的類型安全的Http客戶端,目前推出了2.0+的版本。

Retrofit框架項目地址:https://github.com/square/retrofit。 Retrofit官方文檔地址: http://square.github.io/retrofit/

使用Retrofit

接下來我們來學習下如何使用Retrofit。 首先需要在app/build.gradle添加依賴。

dependencies { //... //retrofit compile 'com.squareup.retrofit2:retrofit:2.1.0' //如果用到gson解析 需要添加下面的依賴 compile 'com.squareup.retrofit2:converter-gson:2.1.0'}

我們以查號碼歸屬地接口為例 https://www.juhe.cn/docs/api/id/11

Retrofit不能直接使用,需要進行初始化,在這里創建NetWork.java

public class NetWork { PRivate static Retrofit retrofit; /**返回Retrofit*/ public static Retrofit getRetrofit(){ if(retrofit==null){ Retrofit.Builder builder = new Retrofit.Builder();//創建Retrfit構建器 retrofit = builder.baseUrl("http://apis.juhe.cn/") //指定網絡請求的baseUrl .addConverterFactory(GsonConverterFactory.create())//返回的數據通過Gson解析 .build(); } return retrofit; }}

Retrofit需要之地baseUrl,往往一個項目中有很多接口,接口都使用相同的服務器地址,這時候可以把接口地址相同的部分抽取到baseUrl中,Retrofit擴展性極好,可以指定返回的數據通過Gson解析,前提你需要保證項目中有Gson框架和com.squareup.retrofit2:converter-gson:2.1.0的依賴。

除了通過Gson解析還可以使用其它的方式解析,需要的依賴也不同,有如下幾種:

Gson: com.squareup.retrofit:converter-gsonJackson: com.squareup.retrofit:converter-jacksonMoshi: com.squareup.retrofit:converter-moshiProtobuf: com.squareup.retrofit:converter-protobufWire: com.squareup.retrofit:converter-wireSimple xml: com.squareup.retrofit:converter-simplexml

Retrofit需要把Http的請求接口封裝到一個接口文件中。

public interface NetInterface { //獲取號碼歸屬地,返回來類型是Bean, 需要兩個參數分別為phone何key @GET("mobile/get") Call<Bean> getAddress(@Query("phone") String phone, @Query("key") String key);}

其中Bean是根據請求的結果創建的對象.

方法前添加@GET注解表示當前請求是Get方式請求,鏈接的地址是baseUrl+”mobile/get”,baseUrl在初始化Retrofit的時候指定了,拼到一起就是 http://apis.juhe.cn/mobile/get。 對于 Retrofit 2.0中新的URL定義方式,這里是我的建議:

baseUrl: 總是以 /結尾url: 不要以 / 開頭

因為如果不是這種方式,拼裝后的結果和你期望的是不一樣的,詳情參考官方文檔。

除了Get請求還有下面幾種請求方式

@POST 表明這是post請求 @PUT 表明這是put請求 @DELETE 表明這是delete請求 @PATCH 表明這是一個patch請求,該請求是對put請求的補充,用于更新局部資源 @HEAD 表明這是一個head請求 @OPTIONS 表明這是一個option請求 @HTTP 通用注解,可以替換以上所有的注解,其擁有三個屬性:method,path,hasBody

最后的HTTP通用注解寫法比較特殊,請求可以代替之前的請求。下面的寫法和之前的@GET效果是一樣的。

/** * method 表示請的方法,不區分大小寫 * path表示路徑 * hasBody表示是否有請求體 */@HTTP(method = "get",path = "mobile/get",hasBody = false)Call<Bean> getAddress(@Query("phone") String phone, @Query("key") String key);

@Quert表示查詢參數,用于GET查詢,注解里的字符串是參數的key值,參數會自動拼裝到Url后面。 除了上面的注解,再給大家介紹幾種不同的注解。

常用的注解

@Url:使用全路徑復寫baseUrl,適用于非統一baseUrl的場景。示例代碼:

@GET Call<ResponseBody> XXX(@Url String url);

@Streaming:用于下載大文件。示例代碼:

@Streaming @GET Call<ResponseBody> downloadFileWithDynamicUrlAsync(@Url String fileUrl);//獲取數據的代碼ResponseBody body = response.body();long fileSize = body.contentLength();InputStream inputStream = body.byteStream();

@Path:URL占位符,用于替換和動態更新,相應的參數必須使用相同的字符串被@Path進行注釋

//實際請求地址會給句groupId的值發生變化--> http://baseurl/group/groupId/users@GET("group/{id}/users") Call<List<User>> groupList(@Path("id") int groupId);

@QueryMap:查詢參數,和@Query類似,區別就是后面需要Map集合參數。示例代碼:

Call<List<News>> getNews((@QueryMap(encoded=true) Map<String, String> options);

@Body:用于POST請求體,將實例對象根據轉換方式轉換為對應的json字符串參數,這個轉化方式是GsonConverterFactory定義的。 示例代碼:

@POST("add")Call<List<User>> addUser(@Body User user);

@Field,@FieldMap:Post方式傳遞簡單的鍵值對,需要添加@FormUrlEncoded表示表單提交

@FormUrlEncoded @POST("user/edit") Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

@Part,@PartMap:用于POST文件上傳,其中@Part MultipartBody.Part代表文件,@Part(“key”) RequestBody代表參數,需要添加@Multipart表示支持文件上傳的表單。

@Multipart @POST("upload") Call<ResponseBody> upload(@Part("description") RequestBody description, @Part MultipartBody.Part file);

完成請求實例

了解了Retrofit,我們用Retrofit請求完成請求,Retrofit使用起來比較省事,核心代碼如下所示:

//初始化Retrofit,加載接口NetInterface netInterface = NetWork.getRetrofit().create(NetInterface.class);//請求接口netInterface.getAddress(editText.getText().toString(),"你的app key") .enqueue(new Callback<Bean>() { @Override public void onResponse(Call<Bean> call, Response<Bean> response) { //請求成功 Bean bean = response.body(); //... } @Override public void onFailure(Call<Bean> call, Throwable t) { //請求失敗 } });

Retrofit會自動在子線程中進行網絡請求,請求結束切換到主線程中,而且內部使用了線程池,對網絡請求的緩存控制的也非常到位,網絡響應速度也是很快的,使用起來非常的爽!

RxJava和Retrofit結合

RxJava非常強大,就連Retrofit都要抱下他的大腿,Retrofit也可以用RxJava方式進行網絡請求,只需要對上面的代碼進行改造即可。

首先添加框架依賴。

dependencies { //... compile 'io.reactivex:rxandroid:1.2.1' compile 'io.reactivex:rxjava:1.1.6' compile 'com.google.code.gson:gson:2.8.0' compile 'com.squareup.retrofit2:retrofit:2.1.0' //如果用到gson解析 需要添加下面的依賴 compile 'com.squareup.retrofit2:converter-gson:2.1.0' //Retrofit使用RxJava需要的依賴 compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'}

修改Retrofit初始化的代碼:

public class NetWork { private static Retrofit retrofit; /**返回Retrofit*/ public static Retrofit getRetrofit(){ if(retrofit==null){ //創建Retrfit構建器 Retrofit.Builder builder = new Retrofit.Builder(); //指定網絡請求的baseUrl retrofit = builder.baseUrl("http://apis.juhe.cn/") //返回的數據通過Gson解析 .addConverterFactory(GsonConverterFactory.create()) //使用RxJava模式 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); } return retrofit; }}

上面代碼我們通過,添加代碼addCallAdapterFactory(RxJavaCallAdapterFactory.create())就變成了使用RxJava模式。

接口也需要修改,把方法的返回值類型由Call改成了RxJava中的Observable。

public interface NetInterface { //獲取號碼歸屬地,返回來類型是Bean, 需要兩個參數分別為phone何key @GET("mobile/get") Observable<Bean> getAddress(@Query("phone") String phone, @Query("key") String key);}

接下來修改最終網絡請求的代碼,可以改成RxJava方式了。

NetInterface netInterface = NetWork.getRetrofit().create(NetInterface.class); //RxJava方式 netInterface.getAddress(editText.getText().toString(),"你的app key") .subscribeOn(Schedulers.io())//設置網絡請求在子線程中 .observeOn(AndroidSchedulers.mainThread())// 回調在主線程中 .subscribe(new Action1<Bean>() { @Override public void call(Bean bean) { //請求成功 } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { //請求失敗 } });

總結

這是Retrofit基礎篇, 后面有時間再繼續深入研究


更多精彩請關注微信公眾賬號likeDev 這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品成人国产在线观看男人呻吟| 亚洲网站在线播放| 日韩欧美视频一区二区三区| 国产欧美精品在线播放| 2024亚洲男人天堂| 欧美成人国产va精品日本一级| 91欧美激情另类亚洲| 欧美一区亚洲一区| 欧美专区中文字幕| 国产精品久久久久久久久| 国产精品户外野外| 亚洲激情小视频| 久久久国产成人精品| 夜夜嗨av色一区二区不卡| 亚洲国产精品大全| 欧美最猛性xxxxx(亚洲精品)| 日韩专区在线观看| 欧美疯狂xxxx大交乱88av| 日韩欧美国产免费播放| 国产97色在线|日韩| 欧美在线一区二区视频| 亚洲精品动漫100p| 欧美精品在线观看91| 2019国产精品自在线拍国产不卡| 国产精品爽黄69| 国产精品www色诱视频| 色综合色综合久久综合频道88| 亚洲欧美自拍一区| 91九色视频导航| 亚洲国产成人精品电影| 精品国产电影一区| 久久久这里只有精品视频| 亚洲成人教育av| 亚洲天堂男人的天堂| 欧美成人第一页| 91精品国产精品| 成人国产精品色哟哟| 亚洲人成在线播放| 国产精品久久久久999| 欧美成年人视频网站| 全亚洲最色的网站在线观看| 精品精品国产国产自在线| 国产精品精品国产| 日韩电影中文 亚洲精品乱码| www.亚洲成人| 日韩在线中文字| 中文字幕亚洲欧美日韩在线不卡| 性日韩欧美在线视频| 日本不卡免费高清视频| 伊人久久久久久久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 久久久久久久一| 亚洲精品av在线播放| 91久久久久久久久久久久久| 久久久久久久97| 国产成人精品视| 亚洲欧美一区二区三区四区| 成人激情综合网| 久久天天躁夜夜躁狠狠躁2022| 国语自产精品视频在线看| 色老头一区二区三区在线观看| 亚洲护士老师的毛茸茸最新章节| 91视频国产一区| 亚洲日韩第一页| 韩国福利视频一区| 精品福利樱桃av导航| 日韩一区二区在线视频| 欧美日韩国产精品一区| 91免费欧美精品| 亚洲国产中文字幕久久网| 色综合天天综合网国产成人网| 亚洲自拍偷拍第一页| 欧美激情中文网| 久久精品欧美视频| 精品视频www| 日韩免费av片在线观看| 成人网在线免费看| 久久久久久久国产| 欧美—级高清免费播放| 亚洲第一色在线| 91香蕉嫩草影院入口| 91久久久久久久久| 亚洲欧美激情四射在线日| 久久久久久av| 亚洲а∨天堂久久精品9966| www.亚洲一区| 国产精品av电影| 欧美第一黄网免费网站| 欧美激情精品久久久久久变态| 亚洲偷欧美偷国内偷| 国产免费成人av| 91香蕉嫩草影院入口| 久久香蕉频线观| 欧美激情久久久久久| 国产精品国产亚洲伊人久久| 亚洲精品在线看| 奇米一区二区三区四区久久| 欧美亚洲另类制服自拍| 国产精品青草久久久久福利99| 黄色精品一区二区| 国产精品久久久亚洲| 中文字幕亚洲情99在线| 欧美激情精品久久久久| 亚洲国产成人在线播放| 中文字幕精品久久久久| 久久黄色av网站| 久久久久久这里只有精品| 国产亚洲视频中文字幕视频| 国产美女扒开尿口久久久| 亚洲免费av网址| 91伊人影院在线播放| 久热精品视频在线观看| 在线观看国产精品淫| 精品电影在线观看| 国产中文字幕91| 国产精品久久久久9999| 亚洲成人激情在线观看| 精品日本高清在线播放| 欧美大成色www永久网站婷| 精品久久久久久中文字幕大豆网| 97久久伊人激情网| 国产精品私拍pans大尺度在线| 亚洲精品av在线| 91在线高清免费观看| 精品日本高清在线播放| 亚洲国模精品一区| 久久久在线观看| 色777狠狠综合秋免鲁丝| 97婷婷涩涩精品一区| 亚洲色图综合网| 91在线视频免费| 国语自产精品视频在免费| 国产精品视频精品视频| 国产精品丝袜久久久久久高清| 国产亚洲精品美女久久久| 亚洲国产精品va在线观看黑人| 亚洲最大成人网色| 亚洲国产97在线精品一区| 日韩欧美在线视频日韩欧美在线视频| 国产午夜精品全部视频播放| 色在人av网站天堂精品| 国产午夜一区二区| 亚洲自拍偷拍视频| 国产成人97精品免费看片| 久久99国产综合精品女同| 欧美黑人狂野猛交老妇| 国产91露脸中文字幕在线| 久久夜色精品国产欧美乱| 亚洲精品www久久久久久广东| 自拍偷拍亚洲欧美| 亚洲电影成人av99爱色| 亚洲国产精品va在看黑人| 色狠狠久久aa北条麻妃| 亚洲97在线观看| 欧美精品成人91久久久久久久| 欧美在线一区二区视频| 久久免费视频观看| 久久久999精品免费| 欧美性色视频在线| 91wwwcom在线观看| 91欧美精品午夜性色福利在线| 欧美日韩亚洲高清| 91久久精品日日躁夜夜躁国产| 亚洲精品98久久久久久中文字幕|