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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android retrofit2.0 rxjava2,Android - 网络请求之 Retrofit2 + RxJava

發布時間:2023/12/15 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android retrofit2.0 rxjava2,Android - 网络请求之 Retrofit2 + RxJava 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

老婆保佑,代碼無BUG

目錄

引用

與其他開源請求庫對比

Retrofit注解

使用

GET請求

POST請求

Retrofit2 + RxJava

基礎使用

優化

封裝Retrofit2 + RxJava

一:引用

compile 'com.squareup.retrofit2:retrofit:2.3.0'

二:與其他開源請求庫對比

image

三:Retrofit注解

四:使用

GET請求

(1) 定義接口

public interface ApiService {

@GET

Call getGetData(@Url String url);

//Get請求,方法中指定@Path參數和@Query參數

//@path參數用于替換url中{}的部分,

//@Query將在url地址中追加類似"page=1"的字符串

@GET("{mobile}/get?")

Call getPathData(@Path("mobile") String mobile, @Query("phone") String phone, @Query("key") String key);

@GET("mobile/get?")

Call getQueryMapData(@QueryMap Map map);

}

(2) Activity

public void btnYS(View view) {

String baseUrl = "http://apis.juhe.cn/";

String url = baseUrl + "mobile/get?phone=18856907654&key=5778e9d9cf089fc3b093b162036fc0e1";

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(baseUrl)

.build();

ApiService apiService = retrofit.create(ApiService.class);

//第一種

Call call = apiService.getGetData(url);

//第二種

HashMap map = new HashMap<>();

map.put("phone", "18856907654");

map.put("key", "5778e9d9cf089fc3b093b162036fc0e1");

Call call = apiService.getQueryMapData(map);

//第三種

apiService.getPathData("mobile","18856907654","5778e9d9cf089fc3b093b162036fc0e1");

call.enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) {

//主線程

try {

Logger.e("response---->" + response.body().string());

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void onFailure(Call call, Throwable t) {

Logger.e("Throwable---->" + t.getMessage());

}

});

}

POST請求

(1) 定義接口

public interface ApiService {

@FormUrlEncoded

@POST("mobile/get") //注意 不是 / 結束

Call postFile(@Field("phone") String phone,

@Field("key") String key);

@FormUrlEncoded

@POST("mobile/get") //注意 不是 / 結束

Call postFile(@FieldMap Map map);

}

(2) Activity

public void btnPostFile(View view) {

String baseUrl = "http://apis.juhe.cn/";

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(baseUrl)

.build();

ApiService apiService = retrofit.create(ApiService.class);

//第一種

Call call = apiService.postFile("18856907654", "5778e9d9cf089fc3b093b162036fc0e1");

//第二種

HashMap map = new HashMap<>();

map.put("phone", "18856907654");

map.put("key", "5778e9d9cf089fc3b093b162036fc0e1");

Call call = apiService.postFile(map);

//省略一下代碼

}

以上講的都是廢話,哈哈下面才是正確的打開放式

Retrofit2 + RxJava

引入 依賴

//Retrofit2

compile 'com.squareup.retrofit2:retrofit:2.3.0'

//RxJava

compile 'io.reactivex.rxjava2:rxjava:2.1.7'

//RxAndroid

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

//Retrofit 支持Rxjava 的支持庫

compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

先導入,然后慢慢說,這些都是干啥的

按套路出牌,肯定先寫接口

public interface ApiService {

@GET

Observable getGetData(@Url String url);

}

看到這,就有兄弟說了,哥們你這里寫錯了,不應該是Observable應該是Call

u=1804519813,2654766997&fm=27&gp=0.jpg

都說了 之前說的都是屁話,這才是正確的打開方式,我們使用的是Observable,RxJava ,都是這么玩的 哈哈

so 繼續

Activity 先來一個看看

package com.allens.retrofitdemo;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import io.reactivex.Observer;

import io.reactivex.android.schedulers.AndroidSchedulers;

import io.reactivex.disposables.Disposable;

import io.reactivex.functions.Consumer;

import io.reactivex.schedulers.Schedulers;

import okhttp3.ResponseBody;

import retrofit2.Retrofit;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

String baseUrl = "http://apis.juhe.cn/";

String url = baseUrl + "mobile/get?phone=18856907654&key=5778e9d9cf089fc3b093b162036fc0e1";

// 設置網絡請求的Url地址

Retrofit retrofit = new Retrofit.Builder()

.baseUrl("http://fanyi.youdao.com/")

// 支持RxJava平臺

//compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' 是他 就是他

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.build();

retrofit.create(ApiService.class)

.getGetData(url)//注意看,這里返回的對象時什么,和原生的返回不同,也是我們把上面接口改的原因

//在子線程取數據

.subscribeOn(Schedulers.io())

.unsubscribeOn(Schedulers.io())

//在主線程顯示ui

// compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 這個庫下才有AndroidSchedulers.mainThread

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(ResponseBody responseBody) {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

}

}

是不是感覺很簡單。哈哈,對就是這么簡單。Post 請求也這么玩,其他都不變,改一下接口,改成 Observable,然后使用RxJava 切換線程就哦了,

如果只是這種程度你就滿足了,哈哈,大兄弟,你也太容易了,

其實我們還可以這么玩

五:優化

1. 設置數據解析器

(1)添加一條依賴

//gson 解析器

compile 'com.squareup.retrofit2:converter-gson:2.3.0'

修改接口

public interface ApiService {

@GET

Observable getGetData(@Url String url);

}

找不同,哈哈 原來的是ResponseBody,現在是Bean,至于Bean 是什么,Bean 對象啊,大兄弟,這個不知道的話,表示。。。。

修改一下Activity中的代碼

Retrofit retrofit = new Retrofit.Builder()

.baseUrl("http://fanyi.youdao.com/")

// 設置數據解析器

.addConverterFactory(GsonConverterFactory.create())

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.build();

retrofit.create(ApiService.class)

.getGetData(url)

.subscribeOn(Schedulers.io())

.unsubscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(Bean bean) {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

可以看到,原來返回的是ResponseBody,現在返回的是已經解析成功的Bean 對象,

關于數據解析器(Converter)

Retrofit支持多種數據解析方式

使用時需要在Gradle添加依賴

數據解析器

Gradle依賴

Gson

com.squareup.retrofit2:converter-gson:2.0.2

Jackson

com.squareup.retrofit2:converter-jackson:2.0.2

Simple XML

com.squareup.retrofit2:converter-simplexml:2.0.2

Protobuf

com.squareup.retrofit2:converter-protobuf:2.0.2

Moshi

com.squareup.retrofit2:converter-moshi:2.0.2

Wire

com.squareup.retrofit2:converter-wire:2.0.2

Scalars

com.squareup.retrofit2:converter-scalars:2.0.2

網絡請求適配器(CallAdapter)

還記得compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' 么,他其實就是一個網絡請求適配器

使用時如使用的是 Android 默認的 CallAdapter,則不需要添加網絡請求適配器的依賴,否則則需要按照需求進行添加

Retrofit 提供的 CallAdapter

使用時需要在Gradle添加依賴:

網絡請求適配器

Gradle依賴

備注

guava

com.squareup.retrofit2:adapter-guava:2.0.2

沒用過

Java8

com.squareup.retrofit2:adapter-java8:2.0.2

沒用過

rxjava

com.squareup.retrofit2:adapter-rxjava:2.0.2

retrofit現在只支持到rxjava1.XX

rxjava

com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.

大神寫的這個庫可以支持到rxjava2.X

到這里就是不是就感覺,人生圓滿了呢,哈哈

還有后招呢,現在我想把服務端返回的數據全部打印出來,怎么做呢

u=1379330171,3486067710&fm=27&gp=0.jpg

2.加入攔截器

(1)導入庫

compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

(2)初始化HttpLoggingInterceptor

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {

@Override

public void log(String message) {

//打印retrofit日志

Log.i("RetrofitLog","retrofitBack = "+message);

}

});

loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

(3)配置okhttp

client = new OkHttpClient.Builder()

.addInterceptor(loggingInterceptor)

.connectTimeout(mTimeOut, TimeUnit.SECONDS)

.readTimeout(mTimeOut, TimeUnit.SECONDS)

.writeTimeout(mTimeOut, TimeUnit.SECONDS)

.build();

然后嘛,

就可以在控制臺看到請求的Log啦

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack ->

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Date: Thu, 28 Dec 2017 09:29:10 GMT

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Server: Apache/2.4.17 (Win64) OpenSSL/1.0.2d PHP/5.6.16

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> X-Powered-By: PHP/5.6.16

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Content-Length: 104

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Keep-Alive: timeout=5, max=100

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Connection: Keep-Alive

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Content-Type: application/json; charset=utf-8

12-28 04:29:07.338 3922-3944/com.allens.test E/XRetrofit: retrofitBack ->

12-28 04:29:07.338 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> {"is_success":true,"result":{"code":"9405f14110770bf8bd09d1397173e382eab923b19820b9330ce7d533cb3d4722"}}

12-28 04:29:07.338 3922-3944/com.allens.test E/XRetrofit: retrofitBack ->

六: 最后在優化

哈哈,自己封裝了一下,有興趣的小伙伴可以點擊查看,及使用

總結

以上是生活随笔為你收集整理的android retrofit2.0 rxjava2,Android - 网络请求之 Retrofit2 + RxJava的全部內容,希望文章能夠幫你解決所遇到的問題。

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