您好,登錄后才能下訂單哦!
這篇文章主要介紹了怎么使用Rxjava+Retrofit+Okhttp進行網絡訪問及數據解析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么使用Rxjava+Retrofit+Okhttp進行網絡訪問及數據解析文章都會有所收獲,下面我們一起來看看吧。
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'
這里有網友提供的免費測試接口
http://gank.io/api/data/Android/10/1
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,我們通過導入的包就知道 * 估計會有人對上面的寫法表示不理解,接下來我們慢慢理解: * @GET 這個表示的是GET請求,想必不用不多說 * "api/data/Android/10/1"可以理解為接口url, 一般url分為兩個部分,前面一部分是不會變化的,就像前面提到的http://gank.io/api/data/Android/10/1這個接口 * http://gank.io/這個是不會改變的,俗稱baseurl,后面的就是接口url部分 * Call<ResponseBody>是retrofit2中的對象,等會我們就知道他的用處 */ }
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); //實例化相關對象 initObject(); } private void initObject() { //這里是構建對象,將之前的接口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() { //發出請求,并接受回調信息 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()); } }); } }
注意需要添加網絡權限
但是這樣的話,看起來是不是結果太亂了,只知道返回了數據,亂七八糟的什么也看不出來,有沒有辦法讓數據更工整點呢,GSON是一個神器
//這里提供兩個接口一個是天氣接口,一個是豆瓣的接口 https://www.sojson.com/open/api/weather/json.shtml?city=廣州 https://api.douban.com/v2/book/search?q=金瓶梅
1,通過GsonFormat插件創建兩個對象WeatherBean和BookBean
2,編寫訪問的接口程序
//接著上面的 MyApi后面繼續寫,這里是訪問程序接口 @GET("open/api/weater/json.shtml") Observable<WeatherBean> getWeather(@Query("city")String city); //@Query("city")String city是需要傳遞的參數用問好隔開 @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 //需要導入兩個依賴 implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
4,通過Rxjava將訪問到的結果發射出來
private void sendWeather(){ //返回的是一個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()); } //這里我們可以使用回調的方式,發給其他的類 //如 listern.send(weatherBean) } @Override public void onError(Throwable e) { Log.i("hb",e.getMessage()); } @Override public void onComplete() { Log.i("hb","sdf"); } }); }
關于“怎么使用Rxjava+Retrofit+Okhttp進行網絡訪問及數據解析”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“怎么使用Rxjava+Retrofit+Okhttp進行網絡訪問及數據解析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。