Rxjava+Retrofit+Okhttp進(jìn)行網(wǎng)絡(luò)訪問及數(shù)據(jù)解析
前言:
在平時(shí)項(xiàng)目開發(fā)中Okhttp3.x、Rxjava2.x、Retrofit2.x,使用的越來越多了,需要我們不斷的去學(xué)習(xí)別人的優(yōu)秀開發(fā)設(shè)計(jì)程序,今天簡單的了解下
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)測試接口
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,我們通過導(dǎo)入的包就知道 * 估計(jì)會(huì)有人對上面的寫法表示不理解,接下來我們慢慢理解: * @GET 這個(gè)表示的是GET請求,想必不用不多說 * "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中的對象,等會(huì)我們就知道他的用處 */ }
3,發(fā)出請求,回調(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)對象 initObject(); } private void initObject() { //這里是構(gòu)建對象,將之前的接口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ā)出請求,并接受回調(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)限
但是這樣的話,看起來是不是結(jié)果太亂了,只知道返回了數(shù)據(jù),亂七八糟的什么也看不出來,有沒有辦法讓數(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,通過GsonFormat插件創(chuàng)建兩個(gè)對象WeatherBean和BookBean
2,編寫訪問的接口程序
//接著上面的 MyApi后面繼續(xù)寫,這里是訪問程序接口 @GET("open/api/weater/json.shtml") Observable<WeatherBean> getWeather(@Query("city")String city); //@Query("city")String city是需要傳遞的參數(shù)用問好隔開 @GET("book/search") Observable<BookBean> getBook(@Query("a")String name);
3,通過訂閱連接觀察者和被觀察者
// Retrofit 通過okhttp訪問接口 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() //刪除原始的請求頭 .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,通過Rxjava將訪問到的結(jié)果發(fā)射出來
private void sendWeather(){ //返回的是一個(gè)Obserable對象 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ò)訪問及數(shù)據(jù)解析的文章就介紹到這了,更多相關(guān)Rxjava網(wǎng)絡(luò)訪問內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
android 關(guān)于利用簽名的SHA1進(jìn)行安全校驗(yàn)的方法之一(推薦)
下面小編就為大家?guī)硪黄猘ndroid 關(guān)于利用簽名的SHA1進(jìn)行安全校驗(yàn)的方法之一(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01Flutter Flar動(dòng)畫使用實(shí)戰(zhàn)示例
這篇文章主要為大家介紹了Flutter Flar動(dòng)畫使用實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Android Studio如何獲取SQLite數(shù)據(jù)并顯示到ListView上
這篇文章主要介紹了Android Studio獲取SQLite數(shù)據(jù)并顯示到ListView上,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Android開發(fā)中WebView的簡單使用小結(jié)
WebView(網(wǎng)絡(luò)視圖)能加載顯示網(wǎng)頁,可以將其視為一個(gè)瀏覽器。它使用了WebKit渲染引擎加載顯示網(wǎng)頁。下面這篇文章給大家總結(jié)了Android中WebView的簡單使用,有需要的可以參考借鑒。2016-09-09Android開發(fā)學(xué)習(xí)筆記之通過API接口將LaTex數(shù)學(xué)函數(shù)表達(dá)式轉(zhuǎn)化為圖片形式
這篇文章主要介紹了Android開發(fā)學(xué)習(xí)筆記之通過API接口將LaTex數(shù)學(xué)函數(shù)表達(dá)式轉(zhuǎn)化為圖片形式的相關(guān)資料,需要的朋友可以參考下2015-11-11Android 短信轉(zhuǎn)換成彩信的消息數(shù)量(實(shí)例代碼)
本文通過實(shí)例代碼給大家介紹了Android 短信轉(zhuǎn)換成彩信的消息數(shù)量,需要的朋友可以參考下2017-05-05Android添加指紋解鎖功能的實(shí)現(xiàn)代碼
當(dāng)開發(fā)的APP需要加密驗(yàn)證時(shí)可以考慮添加系統(tǒng)指紋解鎖功能。這篇文章主要介紹了Android添加指紋解鎖功能的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-07-07Android XRecyclerView實(shí)現(xiàn)多條目加載
這篇文章主要為大家詳細(xì)介紹了Android XRecyclerView實(shí)現(xiàn)多條目加載效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10