Rxjava+Retrofit+Okhttp進(jìn)行網(wǎng)絡(luò)訪問(wèn)及數(shù)據(jù)解析
前言:
在平時(shí)項(xiàng)目開(kāi)發(fā)中Okhttp3.x、Rxjava2.x、Retrofit2.x,使用的越來(lái)越多了,需要我們不斷的去學(xué)習(xí)別人的優(yōu)秀開(kāi)發(fā)設(shè)計(jì)程序,今天簡(jiǎn)單的了解下
1,創(chuàng)建Android項(xiàng)目(Android studio)導(dǎo)入相關(guān)依賴
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.5'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'這里有網(wǎng)友提供的免費(fèi)測(cè)試接口
http://gank.io/api/data/Android/10/1
2,定義接口類
package app.bxvip.com.rxjavaretrofit.imple;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
public interface MyApi {
@GET("api/data/Android/10/1")
Call<ResponseBody> getAndroidInfo();
/**
* 這里使用到了 Okhttp3 和retrofit2,我們通過(guò)導(dǎo)入的包就知道
* 估計(jì)會(huì)有人對(duì)上面的寫法表示不理解,接下來(lái)我們慢慢理解:
* @GET 這個(gè)表示的是GET請(qǐng)求,想必不用不多說(shuō)
* "api/data/Android/10/1"可以理解為接口url, 一般url分為兩個(gè)部分,前面一部分是不會(huì)變化的,就像前面提到的http://gank.io/api/data/Android/10/1這個(gè)接口
* http://gank.io/這個(gè)是不會(huì)改變的,俗稱baseurl,后面的就是接口url部分
* Call<ResponseBody>是retrofit2中的對(duì)象,等會(huì)我們就知道他的用處
*/
}3,發(fā)出請(qǐng)求,回調(diào)信息
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button bt_send;
private TextView tv_result;
public Retrofit retrofit;
public MyApi api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_send =findViewById(R.id.bt_send);
tv_result =findViewById(R.id.result);
bt_send.setOnClickListener(this);
//實(shí)例化相關(guān)對(duì)象
initObject();
}
private void initObject() {
//這里是構(gòu)建對(duì)象,將之前的接口url和baseurl拼接
retrofit = new Retrofit.Builder().baseUrl("http://gank.io/").build();
api = retrofit.create(MyApi.class);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.bt_send:
send();
break;
default:
break;
}
}
private void send() {
//發(fā)出請(qǐng)求,并接受回調(diào)信息
Call<ResponseBody> call = api.getAndroidInfo();
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.i("request return :","success");
tv_result.setText(response.body().toString());
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.i("request return :","faild");
tv_result.setText(t.getMessage());
}
});
}
}注意需要添加網(wǎng)絡(luò)權(quán)限

但是這樣的話,看起來(lái)是不是結(jié)果太亂了,只知道返回了數(shù)據(jù),亂七八糟的什么也看不出來(lái),有沒(méi)有辦法讓數(shù)據(jù)更工整點(diǎn)呢,GSON是一個(gè)神器
4,Rxjava 和 Retrofit的結(jié)合
//這里提供兩個(gè)接口一個(gè)是天氣接口,一個(gè)是豆瓣的接口 https://www.sojson.com/open/api/weather/json.shtml?city=廣州 https://api.douban.com/v2/book/search?q=金瓶梅
1,通過(guò)GsonFormat插件創(chuàng)建兩個(gè)對(duì)象WeatherBean和BookBean

2,編寫訪問(wèn)的接口程序
//接著上面的 MyApi后面繼續(xù)寫,這里是訪問(wèn)程序接口
@GET("open/api/weater/json.shtml")
Observable<WeatherBean> getWeather(@Query("city")String city);
//@Query("city")String city是需要傳遞的參數(shù)用問(wèn)好隔開(kāi)
@GET("book/search")
Observable<BookBean> getBook(@Query("a")String name);3,通過(guò)訂閱連接觀察者和被觀察者
// Retrofit 通過(guò)okhttp訪問(wèn)接口
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://t.weather.sojson.com/api/weather/city/")
.client(getOkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
api = retrofit.create(MyApi.class);
public OkHttpClient getOkHttpClient() {
if (okHttpClient==null){
okHttpClient = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.connectTimeout(3000, TimeUnit.SECONDS)
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
//刪除原始的請(qǐng)求頭
.removeHeader("User-Agent")
//添加新的 User-Agent
.addHeader("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4)")
.build();
return chain.proceed(request);
}
})
.build();
}
return okHttpClient;
}GsonConverterFactory
RxJava2CallAdapterFactory
//需要導(dǎo)入兩個(gè)依賴
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'4,通過(guò)Rxjava將訪問(wèn)到的結(jié)果發(fā)射出來(lái)
private void sendWeather(){
//返回的是一個(gè)Obserable對(duì)象
api.getWeather("廣州").subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<WeatherBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(WeatherBean weatherBean) {
Log.i("hb","ad"+weatherBean.getCity());
if (weatherBean==null){
Log.i("hb",weatherBean.getCity());
}
//這里我們可以使用回調(diào)的方式,發(fā)給其他的類
//如 listern.send(weatherBean)
}
@Override
public void onError(Throwable e) {
Log.i("hb",e.getMessage());
}
@Override
public void onComplete() {
Log.i("hb","sdf");
}
});
}到此這篇關(guān)于Rxjava+Retrofit+Okhttp進(jìn)行網(wǎng)絡(luò)訪問(wèn)及數(shù)據(jù)解析的文章就介紹到這了,更多相關(guān)Rxjava網(wǎng)絡(luò)訪問(wèn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android編程實(shí)現(xiàn)改變控件背景及形態(tài)的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)改變控件背景及形態(tài)的方法,涉及Android控件布局設(shè)置的相關(guān)技巧,需要的朋友可以參考下2016-02-02
Android DigitalClock組件用法實(shí)例
這篇文章主要介紹了Android DigitalClock組件用法,結(jié)合實(shí)例形式分析了DigitalClock組件的布局調(diào)用技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-01-01
Android自定義簡(jiǎn)單的頂部標(biāo)題欄
這篇文章主要為大家詳細(xì)介紹了Android自定義簡(jiǎn)單的頂部標(biāo)題欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Kotlin引用其他xml的view對(duì)象過(guò)程詳解
這篇文章主要介紹了Kotlin中如何引用其他xml中的view對(duì)象,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02
解決java.lang.NoClassDefFoundError: android.support.v4.animati
這篇文章主要介紹了解決Android Studio出現(xiàn)java.lang.NoClassDefFoundError: android.support.v4.animation.AnimatorCompatHelper的問(wèn)題,感興趣的朋友一起看看吧2021-08-08
Android支付寶支付設(shè)計(jì)開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了Android支付寶支付設(shè)計(jì)開(kāi)發(fā),設(shè)計(jì)支付寶支付開(kāi)發(fā)方案,感興趣的小伙伴們可以參考一下2016-02-02
Android開(kāi)發(fā)中匿名設(shè)備標(biāo)識(shí)符OAID使用及初始化
這篇文章主要為大家介紹了Android開(kāi)發(fā)中匿名設(shè)備標(biāo)識(shí)符OAID使用及初始化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Android?Studio實(shí)現(xiàn)智能聊天
這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)智能聊天,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Android編程之語(yǔ)音識(shí)別實(shí)現(xiàn)方法
這篇文章主要介紹了Android編程語(yǔ)音識(shí)別實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android語(yǔ)音識(shí)別的操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-10-10

