retrofit2+rxjava+okhttp网络请求实现
第一步:添加依赖:
compile 'io.reactivex:rxandroid:1.2.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
第二步:创建HttpManager
import android.os.Build;
import okhttp3.Cache; import com.loaderman.samplecollect.constants.HttpUrlConstants;
import com.loaderman.samplecollect.utils.UiUtil; import java.io.File;
import java.io.IOException; import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import okhttp3.Response;
/**
* Created by Administrator on 2018/10/10 0010.
*/ public class HttpManager {
private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
int maxAge = 60 * 5; // 在线缓存在5分钟内可读取
Request request = chain
.request()
.newBuilder()
.addHeader("User-Agent", Build.BRAND + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE)//添加请求头
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
return chain.proceed(request);
}
}; private static File httpCacheDirectory = new File(UiUtil.getContext().getCacheDir(), "mCache");
private static int cacheSize = 10 * 1024 * 1024; // 10 MiB
private static Cache cache = new Cache(httpCacheDirectory, cacheSize);
private static OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.cache(cache)
.build();
private static HttpManager apiManager;
public static HttpManager getInstence() { if (apiManager == null) {
synchronized (HttpManager.class) {
if (apiManager == null) {
apiManager = new HttpManager();
}
}
}
return apiManager;
} private static IHttp httpService; public IHttp getHttpService() {
if (httpService == null) {
synchronized (new Object()) {
if (httpService == null) {
httpService = new Retrofit
.Builder()
.baseUrl(HttpUrlConstants.BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build().create(IHttp.class);
}
}
}
return httpService;
}
}
第三步;创建IHttp
import com.loaderman.samplecollect.constants.HttpUrlConstants;
import com.loaderman.samplecollect.model.GetDataResult;
import com.loaderman.samplecollect.model.RequestParams; import java.util.List;
import java.util.Map; import okhttp3.MultipartBody;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Query;
import rx.Observable; /**
* Created by Administrator on 2018/10/10 0010.
*/ public interface IHttp { @GET(HttpUrlConstants.data_url)
Observable<GetDataResult> getData2(@Query("city") String city); @Headers({"Content-Type: application/json;charset=UTF-8"})
@POST(HttpUrlConstants.data_url)
Observable<GetDataResult> getData1(@Body RequestParams params); @FormUrlEncoded
@POST(HttpUrlConstants.data_url)
Observable<GetDataResult> getData3(@Field("city") String city); @FormUrlEncoded
@POST(HttpUrlConstants.data_url)
Observable<GetDataResult> getData4(@FieldMap Map<String, String> map);
//上传头像
@Multipart
@POST(HttpUrlConstants.data_url)
Observable<GetDataResult> upLoadIcon(@Part List<MultipartBody.Part> partList); }
第四步 :URL常量管理
public interface HttpUrlConstants {
String BASE_URL="http://wthrcdn.etouch.cn/"; String data_url = "weather_mini";
}
第五步 : 代码中进行网络请求 :
示例1:
HttpManager
.getInstence()
.getHttpService()
.getData2("北京市")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<GetDataResult>() {
@Override
public void onCompleted() { } @Override
public void onError(Throwable e) {
LoggerUtil.systemOut(e.toString());
} @Override
public void onNext(GetDataResult getDataResult) {
LoggerUtil.systemOut(getDataResult.toString());
ToastUtil.showMsg(MainActivity.this, getDataResult.data.city);
}
});
示例2 :上传头像
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)//表单类型
.addFormDataPart("token", ConfigConstants.getToken(this))
.addFormDataPart("uid", ConfigConstants.getUid(this))
.addFormDataPart("sign", ConfigConstants.SIGN)
;
RequestBody imageBody = RequestBody.create(MediaType.parse("image/png"), file); //multipart/form-data image/png
builder.addFormDataPart("file", file.getName(), imageBody);//file 后台接收图片流的参数名 +".png"
List<MultipartBody.Part> parts = builder.build().parts(); HttpManager
.getInstence()
.getLearnCarService()
.upLoadIcon(parts)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<UpLoadIconEntity>() {
@Override
public void onCompleted() { } @Override
public void onError(Throwable e) { } @Override
public void onNext(UpLoadIconEntity upLoadIconEntity) { hideLoading();
}
});
到处完成网络请求步骤!!!
retrofit2+rxjava+okhttp网络请求实现的更多相关文章
- Retrofit2+Rxjava+OkHttp的使用和网络请求
Retrofit2+Rxjava+OkHttp的使用和网络请求 https://blog.csdn.net/huandroid/article/details/79883895 加入Rxjava 如果 ...
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式
今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小案例,希望对大家有所帮助,效果图: Retrofit是Square公司开发 ...
- Android okHttp网络请求之Json解析
前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...
- Android okHttp网络请求之Get/Post请求
前言: 之前项目中一直使用的Xutils开源框架,从xutils 2.1.5版本使用到最近的xutils 3.0,使用起来也是蛮方便的,只不过最近想着完善一下app中使用的开源框架,由于Xutils里 ...
- Android okHttp网络请求之文件上传下载
前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...
- Android okHttp网络请求之缓存控制Cache-Control
前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...
- 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)
首先,展示一下封装好之后的项目的层级结构. 1.先创建一个RetrofitApiService.java package com.xdw.retrofitrxmvpdemo.http; import ...
- 一步步搭建Retrofit+RxJava+MVP网络请求框架(二),个人认为这次封装比较强大了
在前面已经初步封装了一个MVP的网络请求框架,那只是个雏形,还有很多功能不完善,现在进一步进行封装.添加了网络请求时的等待框,retrofit中添加了日志打印拦截器,添加了token拦截器,并且对Da ...
随机推荐
- leetcode297. 二叉树的序列化与反序列化
代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...
- [uboot] (番外篇)uboot relocation介绍(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...
- 使用GDI+加载32位的位图或者PNG图片(具有透明通道)
#include <windows.h> #include <gdiplus.h> HBITMAP LoadBitmapFromResource(DWORD ResourceI ...
- Elasticsearch在Centos 7上的安装与配置
https://segmentfault.com/a/1190000011899522 https://blog.csdn.net/xxxxxx91116/article/details/171362 ...
- Bash快捷操作
编辑命令 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + f :按字符前移(右向) Ctrl + b :按字符后移(左向) Alt + f :按单词前移(右向) Al ...
- WSL中使用npm install报错
报错内容类似下面的格式.具体解决方法请看这里:https://github.com/Microsoft/WSL/issues/14 着重关注 https://github.com/Microsoft/ ...
- Coding 账户与 本地 Git 客户端的配置
1.先创建cooding账户 ,注册地址:https://coding.net/ 2.创建好账户后登陆,在个人设置中 验证邮箱 和 验证手机 (邮箱很重要配置需要用到) 3.安装git 客户端 (在 ...
- Miller Rabin 算法简介
0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 1 ...
- 【UTR #3】量子破碎
一道有趣的题. 看到按位的矩阵运算,如果对FWT比较熟悉的话,会比较容易地想到. 这种形式也就FWT等转移里面有吧--就算有其他的也难构造出来. 然而FWT的矩阵并不是酉矩阵(也就是满足 \(AA^T ...
- jQuery_attr()操作
下面来介绍jQuery的属性attr()操作: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...