retrofit2.0+okhttp3+rxjava的封装(简单好用)

来源:互联网 发布:php语言精粹 编辑:程序博客网 时间:2024/06/05 16:47

关于retrofit2.0的简单使用,请看我的另一篇博客:

Retrofit2使用(非常简洁易懂) - 秦时明月 - 博客频道 - CSDN.NET
http://blog.csdn.net/baidu_31093133/article/details/51759452

接下来让我们使用okhttp3和rxjava对retrofit2进行封装,前方高能,干货预警。

代码下载:
retrofit2+rxjava+okhttp使用demo。 - 下载频道 - CSDN.NET
http://download.csdn.net/detail/baidu_31093133/9696239

导入需要依赖的包:

    compile 'com.github.pwittchen:reactivenetwork:0.1.3'    compile "com.squareup.retrofit2:retrofit:2.1.0"    compile "com.squareup.retrofit2:converter-gson:2.1.0"    compile "com.squareup.retrofit2:adapter-rxjava:2.1.0"    compile "com.squareup.retrofit2:converter-scalars:2.1.0"

注意: com.github.pwittchen:reactivenetwork:0.1.3
导入这个包会自动导入它依赖的rxjava包。这个包是用来监听网络状态的。

首先定义一个Httpservice.java的接口文件

在这个接口文件里定义所有retrofit2访问所需的interface接口
例:
Httpservice.java :

public interface HttpService {//上传图片和描述  @Multipart  @POST("上传的地址")    Observable<String> uploadUserFile(            @Part("fileName") RequestBody description,            @Part("file\"; filename=\"image.png\"")RequestBody img    );  //上传图片和图片描述,图片类型,用户id等其它信息  //如果除了图片外还需要传递其它信息,只需要增加几个@Part就可以了。  @Multipart  @POST("上传的地址")    Observable<String> uploadUserFileAndId(            @Part("describe") String describe,            @Part("type") String type,            @Part("userid") String userid,            @Part("fileName") RequestBody description,            @Part("file\"; filename=\"image.png\"")RequestBody img    );}

然后我们再定义一个HttpManager.java,用来管理retrofit2对象

HttpManager.java:

public class HttpManager {    //定义基本地址    public static final String HOST = "baseurl";    //设置连接超时的值    private static final int TIMEOUT = 10;    //声明HttpService对象    protected HttpService httpService;    //声明HttpManager对象    private volatile static HttpManager httpManager;    protected HttpManager() {    //新建一个文件用来缓存网络请求        File cacheDirectory = new File(APP.getContext()                .getCacheDir().getAbsolutePath(), "HttpCache");    //实例化一个OkHttpClient.Builder        OkHttpClient.Builder builder = new OkHttpClient.Builder();    //设置连接超时        builder.connectTimeout(TIMEOUT, TimeUnit.SECONDS);    //设置从主机读信息超时        builder.readTimeout(TIMEOUT, TimeUnit.SECONDS);    //设置写信息超时        builder.writeTimeout(TIMEOUT, TimeUnit.SECONDS);    //设置缓存文件        builder.cache(new Cache(cacheDirectory, 10 * 1024 * 1024));    //设置okhttp拦截器,这样做的好处是可以为你的每一个    //retrofit2的网络请求都增加相同的head头信息,而不用每一个请求都写头信息        builder.addInterceptor(new Interceptor() {            @Override            public Response intercept(Chain chain) throws IOException {                Request request = chain.request().newBuilder()                        .addHeader("Content-Type", "application/json; charset=UTF-8")                        .addHeader("Connection", "keep-alive")                        .addHeader("Accept", "*/*")                        .header("Cache-Control", String.format("public, max-age=%d", 60))                        .removeHeader("Pragma")                        .build();                return chain.proceed(request);            }        });        Retrofit.Builder rBuilder = new Retrofit.Builder()                .client(builder.build())//如果网络访问返回的字符串,而不是json数据格式,要使用下面的转换器             .addConverterFactory(ScalarsConverterFactory.create())   //http://blog.csdn.net/u013003052/article/details/50992436//如果网络访问返回的是json字符串,使用gson转换器.addConverterFactory(GsonConverterFactory.create())      //此处顺序不能和上面对调,否则不能同时兼容普通字符串和Json格式字符串//为了支持rxjava,需要添加下面这个把 Retrofit 转成RxJava可用的适配类                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//基本网络地址 .baseUrl(getHost());        httpService = rBuilder.build().create(HttpService.class);//使用Retrofit.Builder对象可以随时调节retrofit的配置,比下面这种方式要灵活一点//但是并没有优劣之分//Retrofit retrofit = new Retrofit.Builder()//                .addConverterFactory(ScalarsConverterFactory.create())//                .addConverterFactory(GsonConverterFactory.create())//                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//                .baseUrl(HOST)//                .build();//        httpService = retrofit.create(HttpService.class);    }    /**     * 如果有不同的请求HOST可继承此类并Override     *     * @return     */    protected String getHost() {        return HOST;    }    public HttpService getHttpService() {        return httpService;    }//使用单例模式    public static HttpManager getInstance() {        if (httpManager == null) {            synchronized (HttpManager.class) {                if (httpManager == null) {                    httpManager = new HttpManager();                }            }        }        return httpManager;    }    /**     * 处理http请求——常规     *     * @param pCall     * @param pCallback     */    public void doHttpRequest(Call pCall, Callback pCallback) {        Call call = pCall;        call.enqueue(pCallback);    }    /**     * 处理http请求——RX     *     * @param pObservable     * @param pSubscriber     */    public void doHttpRequest(Observable pObservable, Subscriber pSubscriber) {        Observable observable = pObservable                .subscribeOn(Schedulers.io())                .unsubscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread());        observable.subscribe(pSubscriber);    }    /**     * json方式传参     *将json格式的字符串转换成RequestBody     * @param pBody     * @return     */    public RequestBody getPostBody(String pBody) {        RequestBody body = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), pBody);        return body;    }}

以上就是封装的两个关键类,接下来就看怎么使用了。

在公司项目里,我们通常把同一个模块下的网络请求方法统一在一个Server文件里,
而不是直接写在activity里
所以我们需要建一个类,比如叫UserInfoServer.java

UserinfoServer.java

    //上传头像    //参数是,图片路径,描述,和subscriber。    public static void uploadUserIcon(String imgpath, String des, Subscriber<String> subscriber) {  //构建文件描述的RequestBody        RequestBody description =RequestBody.create(MediaType.parse("multipart/form-data"), des);//根据图片路径构建图片的RequestBody        File file = new File(imgpath);        RequestBody imgbody = RequestBody.create(MediaType.parse("multipart/form-data"),file);//获取HttpManager单例,并且调用doHttpRequest方法//只要我们调用下面这个方法就会自动返回一个//rxjava的Observable对象,然后这个Observable对象就会执行网络请求并返回给//参数里的subscriber对象HttpManager.getInstance().getHttpService().uploadUserFile(description, imgbody)    HttpManager.getInstance().doHttpRequest(HttpManager.getInstance().getHttpService().uploadUserFile(description, imgbody), subscriber);    }

然后我们只需要在activity里这样调用:

一行代码完成retrofit网络请求:

 //上传用户图片信息                    UserIntegrationServer.uploadUserIcon("图片路径", "图片描述:上传本地头像", new Subscriber<String>() {                        @Override                        public void onCompleted() {                            LogUtil.HDLog("onCompleted 上传头像======");                        }                        @Override                        public void onError(Throwable e) {                            LogUtil.HDLog("onError 上传头像======"+e.getMessage());                        }                        @Override                        public void onNext(String s) {                            LogUtil.HDLog("onNext 上传头像======" + s);  //上传成功会回调onNext方法,返回值是一个String字符串,这是因为我们在  //HttpService.java里定义的时候Observable<String> uploadUserFile  //定义的返回值是Observable<String>,这个返回值可以根据实际需要修改                        }                    });

以上就是封装的思路,我一直在用,感觉很不错(^__^)

关于rxjava的使用请参考我的另一篇博客

Rxjava入门 - 秦时明月 - 博客频道 - CSDN.NET
http://blog.csdn.net/baidu_31093133/article/details/51931718

1 0
原创粉丝点击