先说Retrofit和RxJava在这个网络请求框架中扮演的角色:
1.Retrofit:负责网络请求,内部使用okhttp作为请求的“引擎”,构建 Retrofit对象时,client(okhttpClient)方法可以传入一个自定义的okhttpClient,如果不调用此方法,则Retrofit会创建一个okhttpClient,当然,这个okhttpClient是最基本的client,并不包括项目现实需求的一些header信息,从下图的源码中我们可以看到这步操作
2.RxJava:负责网络请求和主线程之间的调度,rxjava的核心功能就是异步,在这里只是用在了网络请求上,可以开辟新线程,然后获取数据后在主线程执行,新线程是被观察者,主线程是观察者,这样就是可以在主线程获取观察到的数据然后进行更新UI
下面我们用Retrofit和RxJava构建一个简单的网络请求框架
1.首先,定义baseurl,引入相关包
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.x.y'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
public static final String BASE_URL = "http://web.juhe.cn:8080/";
这里采用一个免费的数据接口来做演示
2.定义实体类,此步骤根据获取的json来定义,本例中实体类名称为ConstellationBean,一个星座信息类
3.利用Retrofit的注解来创建一个获取数据的方法
public interface myApi {
@GET("/constellation/getAll")//get请求,括号中为具体地址
Observable<ConstellationBean> getAll(@QueryMap Map<String,String> map);//定义方法名为getAll,接收一个请求参数的map
}
4.定义一个方法,返回Observable<ConstellationBean>对象,以供activity中调用
public static Observable<ConstellationBean> getBeanInfo(Map<String,String> map){
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())//设置Gson,将数据转换为实体类
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//此方法决定第3步中返回的对象可以是Observable<ConstellationBean>,因为retrofit默认是返回call
.baseUrl(BASE_URL)//设置baseurl
.build();
myApi myApi = retrofit.create(myApi.class);
Observable<ConstellationBean> observable = myApi.getAll(map).observeOn(AndroidSchedulers.mainThread())//在哪个线程订阅的
.subscribeOn(Schedulers.io());//订阅了哪个线程,此处是io线程
return observable;
}
5.在测试的activity中使用
public void getData(){
HashMap<String, String> map = new HashMap<>();
map.put("consName","双子座");
map.put("type","year");
map.put("key","xxx");
NetUtils.getBeanInfo(map)
.subscribe(new Consumer<ConstellationBean>() {
@Override
public void accept(ConstellationBean constellationBean) throws Exception {
tv.setText(constellationBean.getLove().get(0));
}
});
}
此方法用的Consumer是Observable的简化形式,只使用接收数据的accept,完整的Observable里含有error等方法,用以处理不同的信息
6.测试图,点击右下角按钮,获取数据
热门评论
请问有post详细的方法描述吗
大神
demo地址啊 大哥哥