继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Retrofit+RxJava构建网络请求

小怪兽是程序员
关注TA
已关注
手记 5
粉丝 3
获赞 33

先说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.测试图,点击右下角按钮,获取数据
图片描述

打开App,阅读手记
6人推荐
发表评论
随时随地看视频慕课网APP

热门评论

请问有post详细的方法描述吗


大神


demo地址啊 大哥哥

查看全部评论