Rxjava+Retrofit+Okhttp进行网络访问及数据解析
前言:
在平时项目开发中Okhttp3.x、Rxjava2.x、Retrofit2.x,使用的越来越多了,需要我们不断的去学习别人的优秀开发设计程序,今天简单的了解下
1,创建Android项目(Android studio)导入相关依赖
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
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,我们通过导入的包就知道 * 估计会有人对上面的写法表示不理解,接下来我们慢慢理解: * @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中的对象,等会我们就知道他的用处 */ }
3,发出请求,回调信息
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是一个神器
4,Rxjava 和 Retrofit的结合
//这里提供两个接口一个是天气接口,一个是豆瓣的接口 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网络访问内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Android一步步带你在RecyclerView上面实现"拖放"和"滑动删除"功能
这篇文章主要介绍了Android一步步带你在RecyclerView上面实现"拖放"和"滑动删除"功能,需非常不错,具有参考借鉴价值,需要的朋友参考下2017-03-03Flutter打包apk报错Your app isn't using AndroidX解决
这篇文章主要为大家介绍了Flutter打包apk报错Your app isn't using AndroidX解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-08-08Android开发实现ImageView宽度顶边显示,高度保持比例的方法
这篇文章主要介绍了Android开发实现ImageView宽度顶边显示,高度保持比例的方法,结合实例形式分析了Android ImageView界面布局及元素属性动态操作两种功能实现技巧,需要的朋友可以参考下2018-02-02
最新评论