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
- retrofit2.0+okhttp3+rxjava的封装(简单好用)
- Okhttp3+Rxjava+Retrofit2封装
- retrofit2+okhttp3+rxjava网络封装
- Rxjava+Retrofit2+Okhttp3
- 初探Okhttp3+Retrofit2+RXJava
- Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava
- Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava
- Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava
- retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava
- Rxjava2+okhttp3+Retrofit2封装
- OkHttp3的简单封装
- Retrofit2初尝试(rxjava + okhttp3)
- retrofit2+okhttp3+ rxjava 遇到的问题及解决方案
- RxJava + Retrofit2.0的项目实战完美封装
- Android基于Retrofit2.0 +RxJava 封装的超好用的RetrofitClient工具类(六)
- Android基于Retrofit2.0 封装的超好用的RetrofitClient工具类(完美结合RxJava)
- 对OKHttp3的简单封装
- Retrofit2.0 + OkHttp3 遇到的坑
- VS2010 SP1安装卡在VS10Sp1-KB983509处的解决(转)
- HDU2602
- 计算机中的二进制表示-4和5
- 几种线程池的实现算法分析
- Bitmap的深入理解
- retrofit2.0+okhttp3+rxjava的封装(简单好用)
- (开发笔记)转载:eclipse maven 插件 自动生成mybatis dao、mapper
- Handler、Looper、Message、MessageQueue
- IOS-70-emoji表情键盘(防微信,实现自定义文字、表情相互转化,附demo)
- Nginx深入详解之upstream分配方式
- SequenceInputStream序列流的应用
- 78. Subsets
- Java基础之(三十六)Java异常处理<一>
- jdk7 新特性