接入说明:项目中已集成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 flowable1 = RetrofitUtils.getFlowable("http://apis.juhe.cn/", "mobile/get", user, tClass);

Flowable tFlowable = flowable1.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe();

參数说明:第一个是基本地址,第二个是server地址,此处完整的地址是:http://apis.juhe.cn/mobile/get

                第三个是请求实体类。属性必须全为public,第四个是server返回的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() {

@Override

public void accept(DataEntity dataEntity) throws Exception {

Toast.makeText(MainActivity.this, dataEntity.getResult().getCity(), Toast.LENGTH_SHORT).show();

}

}, new Consumer() {

@Override

public void accept(Throwable throwable) throws Exception {

Log.i("sss",throwable.toString());

Toast.makeText(MainActivity.this, "网络连接失败", Toast.LENGTH_SHORT).show();

}

});

}

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

注意事项:请求实体类中的属性由于反射的原因,必须所有写成public。

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

/**

* Created by 胡楠启 on 2017/2/24.

* Function:

* Desc: 网络请求管理类

*/

public class NetWork {

//查询手机号码的归属地

public static Flowable query(UserEntity user,Class tClass) {

Flowable flowable1 = RetrofitUtils.getFlowable("http://apis.juhe.cn/", "mobile/get", user, tClass);

Flowable tFlowable = flowable1.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());

return tFlowable;

}

}

说明:此处依据server接口个数,把所有的接口详细细节创建在这里,方便调用管理。此处详细的作用,确定接口的URL。确定代码执行线程。以及接口回调后的执行线程,

 

        每个server接口都须要写一个相应的參数并配置參数。

 切割线------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(2)初始化retrofit   

/**

* Created by 胡楠启 on 2017/2/24.

* Function:

* Desc:

*/

public class RetrofitUtils {

public static Flowable getFlowable(String baseurl, String url, Object bin, final Class tClass){

//得到包括參数的map集合

HashMap 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 flowable = retrofitInterface.getData(url, maps);

Flowable map = flowable.map(new Function() {

@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 getData(@Url String url, @QueryMap HashMap map);

}

说明:此处Observable能够设置返回详细的类型。

@POST

Observable getData(@Url String url, @QueryMap HashMap 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 getValuesHash(Class clazz,Object object){

HashMap result=new HashMap();

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 getData(@Url String url, @QueryMap HashMap map);这里加入@Headers 注解。

查看原文