Retrofit+Rxjava发起网络请求
Retrofit我们可以理解为OkHttp的加强版,它也是一个网络加载框架。底层是使用OKHttp封装的,准确来说网络请求的工作本质上是OkHttp完成,而 Retrofit 仅负责网络请求接口的封装。它的一个特点是包含了特别多注解,方便简化你的代码量。它的好处在于超级解耦,可以配置不同HttpClient来实现网络请求,如OkHttp、HttpClient…支持同步、异步和RxJava,还可以配置不同的反序列化工具来解析数据,如json、xml等等(这里Retrofit的过多介绍我就不多说啦,不懂的小伙伴可以在网上百度一下,去深入了解一下Retrofit的请求方法等)
那rxjava又是什么呢?
看看大神的博客你就知道rxjava是啥了Rxjava 入门教程
看完了Retrofit 和Rxjava,那么接下来我们就来了解了解两者的结合体Retrofit+Rxjava实现网络请求
首先写一个Javabean(天气类)
package com.example.retrofit_net_demo;
public class WeatherBean {
private DataBean data;
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
private String city;
private String cold;
private String temperature;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCold() {
return cold;
}
public void setCold(String cold) {
this.cold = cold;
}
public String getTemperature() {
return temperature;
}
public void setTemperature(String temperature) {
this.temperature = temperature;
}
}
}
然后我们自定义一个接口
package com.example.retrofit_net_demo;
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;
public interface RxWeatherService {
//网络接口的使用是查询天气
@GET("weather_mini")
//此处回调返回的可为任意类型Observable<T>,不用自己去解析json数据
Observable<WeatherBean> getMessage(@Query("city") String city);
}
然后我从网上找了一个别人的接口来做这个demo的接口
package com.example.retrofit_net_demo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.AndroidException;
import android.util.Log;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Scheduler;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class MainActivity extends AppCompatActivity {
public static final String Api = "http://wthrcdn.etouch.cn/";
public static final String TAG = "MainActivity-vv";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
doRequestByRxRetrofit();
}
private void doRequestByRxRetrofit() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Api)
//设置 Json 转换器
.addConverterFactory(GsonConverterFactory.create())
//RxJava 适配器
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
RxWeatherService rxWeatherService = retrofit.create(RxWeatherService.class);
rxWeatherService.getMessage("北京")
//IO线程加载数据
.subscribeOn(Schedulers.io())
//主线程显示数据
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<WeatherBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(WeatherBean weatherBean) {
Log.d(TAG, "onNext:温度为" + weatherBean.getData().getWendu() + " " + weatherBean.getData().getGanmao()
+ " city:" + weatherBean.getData().getCity());
}
});
}
}
有什么错误的话欢迎评论,不喜勿喷!!
还没有评论,来说两句吧...