日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Retrofit2.0和Rxjava结合使用的简单记录

發(fā)布時間:2025/5/22 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Retrofit2.0和Rxjava结合使用的简单记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

Gradle的配置(該配置是針對rxjava1.x的)

compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'//okhttp log 工具compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'compile 'com.google.code.gson:gson:2.5'compile 'io.reactivex:rxandroid:1.1.0'compile 'io.reactivex:rxjava:1.1.0'compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'

##常用的注解

@Path:該注解寫在方法中的參數(shù)類型(String)前面;用于指定@POST()或者@GET()請求中括號中的參數(shù);該參數(shù)中不允許存在 斜杠 , 即只能表示一級,類似"目錄"; 可以把所有的路徑都存在一個類中,在@Post()的括號中引用這個路徑,這樣@Path就不需要使用;除非相同路徑下都是最后一級不相同,可以使用該注解。

@ Url :該注解寫在方法的參數(shù)類型前面;表示完整的Url。

@Query:用于自動拼接URL ?id=3&name=zhangsan&age=24;Post和Get請求中都可以使用

@QueryMap :傳入一個Map類型,自動拼接URL;Post和Get請求中都可以使用

@FormUrlEncoded 和Post一起使用;提交沒有文件的表單數(shù)據(jù);和參數(shù)注解@Field和@FieldMap配合使用

@ Field:用于POST請求中,輸入拼接的請求體鍵值對;不帶文件上傳的表單提交

@ FieldMap :用于POST請求中,輸入拼接的請求體鍵值對的Map對象;不帶文件上傳的表單提交

@Streaming:下載文件必須要加上這個,保證下載的內容不會一下子都加載到內存中去;表示和服務器是長連接,會邊下載流,邊處理(比如寫入存儲器中),使得內存不會有一直持有所有的流數(shù)據(jù)。

@Multipart:提交帶有文件的表單使用;配合參數(shù)注解@Part和@PartMap使用;@PartMap的類型是 <String,RequestBody>

@Part,@PartMap: 用于POST文件上傳 @PartMap接受的數(shù)據(jù)類型是HashMap<String,RequestBody> @Part用法:@Part("xxx") RequestBody body

@Body 如果上傳的內容不是用@MultiPart來修飾的,也不是要傳遞鍵值對。參數(shù)中不能用@Part或者@PartMap來修飾。此時選擇用@Body;比如傳遞一個json字符串給服務器,此時就需要body,還需要改一下Header

關于文件的上傳: 參見 :http://blog.csdn.net/zhangxing52077/article/details/52830045 文件的下載可以使用 RxDownload

@Body:POST請求中的參數(shù)

@RequestBody

okhttp3.Media的常見type類型

eg: RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), jsonString);

text/html : HTML格式 text/plain :純文本格式
text/xml : XML格式 image/gif :gif圖片格式
image/jpeg :jpg圖片格式 image/png:png圖片格式 以application開頭的媒體格式類型:

application/xhtml+xml :XHTML格式 application/xml : XML數(shù)據(jù)格式 application/atom+xml :Atom XML聚合格式
application/json : JSON數(shù)據(jù)格式 application/pdf :pdf格式
application/msword : Word文檔格式 application/octet-stream : 二進制流數(shù)據(jù)(如常見的文件下載) application/x-www-form-urlencoded : <form encType=””>中默認的encType,form表單數(shù)據(jù)被編碼為key/value格式發(fā)送到服務器(表單默認的提交數(shù)據(jù)的格式)

另外一種常見的媒體格式是上傳文件之時使用的: multipart/form-data : 需要在表單中進行文件上傳時,就需要使用該格式

@Headers :注解設置固定的請求頭,所有請求頭不會相互覆蓋,即使名字相同。

@Headers("Cache-Control: max-age=640000") @GET("widget/list") Call<List<Widget>> widgetList(); // 注意Headers括號中的鍵值對,冒號后面有一個空格!!!! @Headers({ "Accept: application/vnd.github.v3.full+json","User-Agent: Retrofit-Sample-App"}) @GET("users/{username}")Call<User> getUser(@Path("username") String username);

@Header 使用 @Header 注解動態(tài)更新請求頭,匹配的參數(shù)必須提供給 @Header ,若參數(shù)值為 null ,這個頭會被省略,否則,會使用參數(shù)值的 toString 方法的返回值。

@GET("user") Call<User> getUser(@Header("Authorization") String authorization)

獲取Retrofit的實例

public class RetrofitClient {private static final String TAG = "RetrofitClient";// private static final String BASE_URL ="https://api.douban.com/v2/movie/";private static OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException { // Log.v(TAG,chain.connection().route().address().toString());Log.v(TAG,chain.request().url().toString());Request.Builder builder = chain.request().newBuilder();//添加共同的頭信息 // builder.addHeader("token", "abc");return chain.proceed(builder.build());}}).connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).build();private static class Holder{private static Retrofit retrofit = new Retrofit.Builder().addCallAdapterFactory(RxJavaCallAdapterFactory.create()).addConverterFactory(GsonConverterFactory.create()).addConverterFactory(StringConverterFactory.create()).baseUrl(UrlConst.BASE_URL).client(client).build();}public static Retrofit getRetrofitInstance() {return Holder.retrofit;}private static Retrofit retrofit2;public static Retrofit getStringRetrofitInstance(String url) {retrofit2 = new Retrofit.Builder().addCallAdapterFactory(RxJavaCallAdapterFactory.create()).addConverterFactory(StringConverterFactory.create()).baseUrl(url).client(client).build();return retrofit2;}public static Retrofit retrofit3;public static Retrofit getRetrofitInstance(String url){retrofit3 = new Retrofit.Builder().addCallAdapterFactory(RxJavaCallAdapterFactory.create()).addConverterFactory(StringConverterFactory.create()).baseUrl(url).client(client).build();return retrofit3;} }

創(chuàng)建Service的接口

GET請求

//具體的網(wǎng)絡url : 舉例子:https://api.douban.com/v2/movie/top250?start=2&count=4 public interface ApiService {@GET("top250")Observable<Entity> getMovies(@Query("start") int start,@Query("count") int count); } // 最好這么寫,參數(shù)用變量代替 public interface ApiService {@GET("{url}")Observable<Entity> getMovies(@Path("url") String url, @Query("start") int start, @Query("count") int count); }

POST請求

public interface MovieService { //獲取豆瓣Top250 榜單 @FormUrlEncoded@POST("top250") Observable<MovieSubject> getTop250(@Field("start") int start, @Field("count") int count); }關于Post請求需要注意的幾個地方: 必須要有@FormUrlEncoded 配合 Filed使用時

下載文件的GET請求

//必須要加上@Streaming,不然會把下載的東西全部讀到內存中去@Streaming@GETObservable<ResponseBody> downloadFile(@Url String url);

寫入ReponseBody到文件系統(tǒng)

/*** 將ResponseBody中的內容保存到本地路徑 ;該路徑必須已經(jīng)存在** @param body* @param localPath*/public static void writeResponseBodyToDisk(ResponseBody body, String localPath) {File file = new File(localPath);InputStream is = null;OutputStream os = null;long totalLength = body.contentLength();long currentLength = 0;double rate = 0;byte[] bytes = new byte[4096];try {os = new FileOutputStream(file);is = body.byteStream();int length = -1;while ((length = is.read(bytes)) != -1) {os.write(bytes, 0, length);currentLength += length;rate = currentLength * 1.0 / totalLength;}os.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (is != null) {is.close();}if (os != null) {os.close();}} catch (IOException e) {e.printStackTrace();}}}

踩過的坑:

1.Post請求中

//獲取 任務@POST("index.php/machine/{url}")Observable<String> getTask(@Path("url") String url, @Body RequestBody requestBody);

注解Post的括號中如果有引用方法的url時,那么方法中的url不能包括斜杠 / ,也不能包括問號 ? 因為斜杠 / 會被轉義為 %2F ; ? 會被轉義為 %3F ;斜杠和問號只有寫在@POST的括號中才不會被轉義。

2.Post請求上傳多個文件和其他字符串參數(shù) 文件上傳可以用兩種方式來做: 1.使用MultipartBody.Part 類型修飾在函數(shù)的文件參數(shù)前面;文件的參數(shù)和字符串參數(shù)分開來做;字符串參數(shù)可以用@PartMap來包裹

RequestBody apkBody = RequestBody.create(MediaType.parse("multipart/form-data"),file_apk);MultipartBody.Part partApk = MultipartBody.Part.createFormData("apk_url",file_apk.getName(),apkBody);

2.(用的少)使用@PartMap注解修飾參數(shù)類型前面 , 上傳多個文件,但是對創(chuàng)建文件的RequestBody做一步處理;這種方式其實是把多個文件和字符串都放在@PartMap修飾的HasMap<String,RequestBody>中即:

RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);RequestBody requestBody1 = RequestBody.create(MediaType.parse("multipart/form-data"), file1);Map<String, RequestBody> params = new HashMap<>();params.put(key+"\"; filename=\""+ file.getName(), requestBody);params.put(key1+"\"; filename=\""+ file1.getName(), requestBody1);

3.如果服務器返回值不是一個json,而是一個字符串String。那么我們用的GsonConvertory的Retrofit就不可用了。需要自定義一個StringConvertory.

  • 這種上傳方式?jīng)]有嘗試過:
  • MultipartBody.Part photo1part = MultipartBody.Part.createFormData("pic1", "pic2", requestBody1); @Multipart@POST("upload.php")Observable<ResponseBody> uploadFile(@Part() List<MultipartBody.Part > files );

    5.文件和參數(shù)同時上傳的時候會遇到參數(shù)的value如果是String,會有兩個雙引號在外面。原因是由于使用了 Map<String,String>的方式,可以使用Map<String,RequestBody>的方式來解決這個問題。

    轉載于:https://my.oschina.net/u/3246345/blog/1488583

    總結

    以上是生活随笔為你收集整理的Retrofit2.0和Rxjava结合使用的简单记录的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 乱色精品无码一区二区国产盗 | 韩国三级hd中文字幕的背景音乐 | 亚洲不卡av一区二区 | 亚洲精品动漫在线观看 | 欧美一级性生活视频 | 亚洲图色av | 久久久久久久久久免费视频 | 丰满人妻一区二区三区大胸 | 欧美日韩免费在线视频 | 日韩一级一级 | 一本一道av| 国模在线| 永久免费看片在线播放 | 激情福利在线 | 欧美精品免费一区二区 | 欧美区一区二区 | 日本精品人妻无码免费大全 | 日本一区免费视频 | 成人免费毛片视频 | 亚洲污污视频 | 欧美精品欧美精品系列 | 免费大黄网站 | 国产激情毛片 | 91免费视频观看 | 日本电影成人 | 日韩视频专区 | 国语对白一区二区三区 | 色综合天天综合网国产成人网 | 色婷婷狠狠18禁久久 | 国产一区二区三区免费看 | 苍井空浴缸大战猛男120分钟 | 黄色草逼网站 | 三级特黄视频 | 日韩黄色网 | 日韩亚洲精品视频 | 午夜一本 | 国产精品视频一区二区三区, | 六月婷婷中文字幕 | 91精品免费看| 国产+日韩+欧美 | 色哟哟入口 | 艳妇乳肉豪妇荡乳xxx | 一区二区三区视频在线播放 | 四虎影院在线观看免费 | julia一区| 国产在线无 | 毛片a区 | 美女洗澡隐私免费网站 | 久久久精品人妻一区二区三区色秀 | 日本少妇性生活 | 91看片免费 | 免费 成 人 黄 色 | 日本一区二区三区免费看 | 成人刺激视频 | 狠狠干免费视频 | 精品国产一区二区三区在线 | 色婷婷五 | 久草青青视频 | 欧美性www| 天天天天天天天干 | 国产4区 | 亚洲精品在线视频免费观看 | 国产精品美女在线 | 欧美日韩a| 国产裸体视频网站 | 黑人一级黄色片 | 性爱免费在线视频 | 婷婷av一区二区三区 | 222aaa| 欧美比基尼 | 在线观看黄色国产 | 一个色av | 国产精品天天操 | 欧美日本在线播放 | 亚洲AV无码成人精品区东京热 | 日批免费在线观看 | 在厨房拨开内裤进入毛片 | 女人的天堂av在线 | 综合亚洲色图 | 亚洲美女在线播放 | 日本啪啪啪一区二区 | 97少妇| 福利在线免费视频 | 精品久久久在线观看 | 懂色av一区二区三区四区 | 中文字幕av一区二区三区谷原希美 | 无码免费一区二区三区免费播放 | 国产精品三级电影 | 在线免费观看网站入口在哪 | 国产综合久久久久久鬼色 | 一区二区三区啪啪啪 | 久久中文字幕在线观看 | 成为性瘾网黄的yy对象后 | 亚洲午夜无码久久久久 | ts人妖在线观看 | 91在线精品入口 | 日本真人做爰免费视频120秒 | 毛片www | 91精品啪在线观看国产线免费 |