retrofit+RXjava二次封装

来源:互联网 发布:人工智能利弊 编辑:程序博客网 时间:2024/05/16 18:18

接入说明:项目中已集成RXjava,RXandroid,Retrofit,为避免包冲突,不需要再次接入。即可直接使用RXjava,Retrofit的全部api.

github地址:https://github.com/hunanqi/Retrofit_Two

第一步:在项目的gradle文件中:

allprojects {    repositories {        ...        maven { url 'https://jitpack.io' }    }}
第二步:在app的gradle文件中。

dependencies {            compile 'com.github.hunanqi:Retrofit_Two:1.0.0'    }

第三步使用:

  Flowable<T> flowable1 = RetrofitUtils.getFlowable("http://apis.juhe.cn/", "mobile/get", user, tClass);        Flowable<T> tFlowable = flowable1.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe();
参数说明:第一个是基本地址,第二个是服务器地址,此处完整的地址是:http://apis.juhe.cn/mobile/get  

                第三个是请求实体类。属性必须全为public,第四个是服务器返回的json数据对应的实体类。

也可像下面例子中的使用方式,建立一个NetWork网络请求管理类方便管理。

1.测试接口的说明

  请求地址:http://apis.juhe.cn/mobile/get?phone=13429667914&key=您申请的KEY

  返回数据示例:

{"resultcode":"200","reason":"Return Successd!","result":{    "province":"浙江",    "city":"杭州",    "areacode":"0571",    "zip":"310000",    "company":"中国移动",    "card":"移动动感地带卡"}}
2.封装过后的使用(UserEntity表示请求实体类,此处有2个参数,DataEntity:返回数据的实体类,如上json 数据创建的实体类)
//网络测试private void http() {    UserEntity user = new UserEntity();    user.phone = "13438284220";    user.key = "6fe9a2f9cc05e6941bcc45e30a32e51a";    NetWork.query(user,DataEntity.class).subscribe(new Consumer<DataEntity>() {        @Override        public void accept(DataEntity dataEntity) throws Exception {            Toast.makeText(MainActivity.this, dataEntity.getResult().getCity(), Toast.LENGTH_SHORT).show();        }    }, new Consumer<Throwable>() {        @Override        public void accept(Throwable throwable) throws Exception {            Log.i("sss",throwable.toString());            Toast.makeText(MainActivity.this, "网络连接失败", Toast.LENGTH_SHORT).show();        }    });}

说明:第一个内部类是为了处理数据,第二个是处理网络异常的信息。参数方面第一个参数是请求实体类,第二个是服务器返回的json数据的实体类

注意事项:请求实体类中的属性因为反射的原因,必须全部写成public。

(1).创建网络请求管理类3.封装思路(由外向内)

/** * Created by 胡楠启 on 2017/2/24. * Function: * Desc: 网络请求管理类 */public class NetWork {    //查询手机号码的归属地    public static <T> Flowable<T> query(UserEntity user,Class<T> tClass) {        Flowable<T> flowable1 = RetrofitUtils.getFlowable("http://apis.juhe.cn/", "mobile/get", user, tClass);        Flowable<T> tFlowable = flowable1.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());        return tFlowable;}}

说明:此处根据服务器接口个数,把全部的接口具体细节创建在这里,方便调用管理。此处具体的作用,确定接口的URL,确定代码运行线程,以及接口回调后的运行线程,

 

        每一个服务器接口都需要写一个对应的参数并配置参数。

 分割线------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(2)初始化retrofit   

/** * Created by 胡楠启 on 2017/2/24. * Function: * Desc: */ public class RetrofitUtils {    public static<T> Flowable<T> getFlowable(String baseurl, String url, Object bin, final Class<T> tClass){        //得到包含参数的map集合        HashMap<String, String> maps = MapUtils.getValuesHash(bin.getClass(), bin);        //retrofit初始化        retrofit2.Retrofit retrofit = new retrofit2.Retrofit.Builder()                .baseUrl(baseurl)                .client(getOkHttp())//增加OKhttp设置生效                //增加返回值为String的支持                .addConverterFactory(ScalarsConverterFactory.create())                //增加返回值为Gson的支持(以实体类返回)                .addConverterFactory(GsonConverterFactory.create())                //支持RXjava                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())                .build();        RetrofitInterface retrofitInterface = retrofit.create(RetrofitInterface.class);        Flowable<String> flowable = retrofitInterface.getData(url, maps);        Flowable<T> map = flowable.map(new Function<String, T>() {            @Override            public T apply(String s) throws Exception {                Gson gson = new Gson();                T t = gson.fromJson(s, tClass);                return t;            }        });        return map;    }    /**     * 设置OKhttp的参数,打印网络请求详情     */    private static OkHttpClient getOkHttp(){        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {            @Override            public void log(String message) {                //打印retrofit日志                Log.i("RetrofitLog","retrofitBack = "+message);            }        });        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);        OkHttpClient client=new OkHttpClient.Builder().addInterceptor(loggingInterceptor).build();        return client;    } }

说明:此处首先把实体类通过反射转换成map格式的数据,然后初始化Retrofit,的设置,然后根据接口得到observable ,其中getOkHttp此处目的是为了打印出网络请求的详细信息,包括请求地址,post数据,返回数据等,需要在gradle中加入以下依赖:

retrofit 接口详情:

public interface RetrofitInterface {    @POST    Flowable<String> getData(@Url String url, @QueryMap HashMap<String,String> map);}

说明:此处Observable可以设置返回具体的类型,

@POST    Observable<DataEntity> getData(@Url String url, @QueryMap HashMap<String,String> map);

免除后期NetWork类中将String解析成具体的实体类的操作。retrofit会自动返回DataEntity类,但是如果固定死了此处的泛型,那么每一个后台的接口,就需要在这里对应的写一个Retrofit的接口。

所以此处采用String类型,再在NetWork类中进行map操作符 转换成DataEntity类。如果需要,这里整个app只写一个接口,且后续不再retrofit自动返回实体类,不用像此处NetWork类手动解析,有待后续研究。

(3)关于实体类转化为map数据。

public class MapUtils {     /**     * 把请求实体类里面的参数取出来,然后放入hashmap中     * @param clazz     * @param object     * @return     */    public static HashMap<String,String> getValuesHash(Class<?> clazz,Object object){        HashMap<String,String> result=new HashMap<String,String>();        if(object.equals(null))return result;        Field[] field  = clazz.getFields();        for(Field f : field){            if ("serialVersionUID".equals(f.getName()))                continue;            try {                Object value=f.get(object);                 if(value!=null){                     result.put(String.valueOf(f.getName()),String.valueOf(value));                 }            } catch (IllegalAccessException e) {                e.printStackTrace();            } catch (IllegalArgumentException e) {                e.printStackTrace();            }         }        return result;    }

备注:以上就是Retrofit简单post请求的简单封装思路。更多需求,可根据rtetrofit的配置,特殊处理。如果需要设置请求头信息可在

@POST
Flowable<String> getData(@Url String url, @QueryMap HashMap<String,String> map);这里添加@Headers 注解。








0 0
原创粉丝点击