由于公司的项目需要上传文件,利用阿里的oss存储,整个过程比较麻烦。对于网络访问就简单的用okhttp封装了一些需要的方法,比较简单。
主要从ok的两点入手,一是ok获取网络结果是在子线程,无法直接更新比较麻烦,另外就是参数将结果解析。
直接上代码
创建httpmanager类,官方文档都说了最好使用单例,所以我们也就不对着干了。
官网地址:http://square.github.io/okhttp/
此处需要注意在2.x版本时,时间时间等设置与3.x版本不一样,如果还像2.x版本设置是没有效果的差异如下:
//创建OkHttpClient的实例
// okHttpClient = new OkHttpClient(); 2.0版本构建类的模式okHttpClient = new OkHttpClient.Builder()//3.x版本构建类的模式
.readTimeout(30, TimeUnit.SECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
/* .readTimeout(1, TimeUnit.MINUTES)
.connectTimeout(1, TimeUnit.MINUTES)*/
.build();//3.0后最新编辑模式
整体上就不说了直接贴上代码:
public class HttpManager {
private static HttpManager mHttpManager;
// private final OkHttpClient okHttpClient;
private final Gson gson;
private final Handler handler;
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");//post请求编码
private final OkHttpClient okHttpClient;
private String mNppcodes="abcd";
public HttpManager() {
//创建OkHttpClient的实例
// okHttpClient = new OkHttpClient(); 2.0版本构建类的模式
okHttpClient = new OkHttpClient.Builder()//3.x版本构建类的模式
.readTimeout(30, TimeUnit.SECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
/* .readTimeout(1, TimeUnit.MINUTES)
.connectTimeout(1, TimeUnit.MINUTES)*/
.build();//3.0后最新编辑模式
//解析JSON
gson = new Gson();
//子线程中更新Ui用到Handler
handler = new Handler(Looper.getMainLooper());
}
//单例
public static HttpManager getHttpManager() {
if (mHttpManager == null) {
synchronized (HttpManager.class) {
if (mHttpManager == null) {
mHttpManager=new HttpManager();
}
}
}
return mHttpManager;
}
/**
* get请求
* @param url
* @param baseCallBack
*/
public void get(String url,BaseCallBack baseCallBack,String token){
Request request=buildRequest(url, RequestTyep.GET,token);
doRequest(request,baseCallBack);
}
/**
* post请求
* @param url
* @param baseCallBack
*/
public void postJson(String url,Object json ,String token,BaseCallBack baseCallBack){
Gson gson = new Gson();
String gsonString = gson.toJson(json);
Request.Builder build=new Request.Builder();
build
.post(buildRequestJsonBody(gsonString))
.url(url)
.addHeader("C_AT_",token)
.addHeader("nppCode",mNppcodes);
Request request = build.build();
doRequest(request,baseCallBack);
}
/*
* 并且返回时间差
* */
public void postJsonAndGet(String url, Object json , String token, BaseCallBack baseCallBack, Context context){
Gson gson = new Gson();
String gsonString = gson.toJson(json);
Request.Builder build=new Request.Builder();
build
.post(buildRequestJsonBody(gsonString))
.url(url)
.addHeader("C_AT_",token)
.addHeader("nppCode",mNppcodes);
Request request = build.build();
doRequestForgettime(request,baseCallBack,context);
}
/*同步post请求
* */
public String executepostJson(String url,String json ,String token) {
Request.Builder build=new Request.Builder();
build.post(buildRequestJsonBody(json))
.url(url)
.addHeader("C_AT_",token)
.addHeader("nppCode",mNppcodes);
Request request = build.build();
return doExecuteRequest(request);
}
/**
* postJson的body
*/
private RequestBody buildRequestJsonBody(String json) {
RequestBody body = RequestBody.create(JSON,json);
return body;
}
/**
* 创建Request//请求头也可以分装在此
* @return
*/
private Request buildRequest(String url, RequestTyep type, String token) {
Request.Builder build=new Request.Builder();
if (type== RequestTyep.GET){
build.get();
}else if (type== RequestTyep.POST){
build.post(buildRequestBody());
}
build.url(url)
.addHeader("C_AT_",token);
return build.build();
}
/**
* 创建post请求体
* @return
*/
private RequestBody buildRequestBody() {
FormBody.Builder builder=new FormBody.Builder();
return builder.build();
}
/**
* 请求类型
*/
enum RequestTyep{
GET,
POST,
POSTJSON
}
private String doExecuteRequest(Request request) {
Response response = null;
try {
response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
String string = response.body().string();
return string;
} else {
LogUtils.wyjlog("false");
return "";
}
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
/**
* okHttp post同步请求
*/
private String executePost (String url,String json) {
try {
Gson gson = new Gson();
String gsonString = gson.toJson(json);
Request.Builder build=new Request.Builder();
build .post(buildRequestJsonBody(gsonString))
.url(url).addHeader("C_AT_",token)
.addHeader("nppCode",mNppcodes);
Request request = build.build();
final Call call = okHttpClient.newCall(request);//创建一个Call
Response response = call.execute(); //执行请求
if (response.isSuccessful()) { //请求执行成功
LogUtils.wyjlog("response ----->" + response.body().string());
return response.body().string();
} else {
return "";
}
} catch (Exception e) {
return "";
}
}
private void doRequest(Request request, final BaseCallBack baseCallBack){
// okHttpClient.newCall().execute();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
senFailure(baseCallBack,call, e,"未连接上服务器"+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
boolean successful = response.isSuccessful();
if (successful){
String json = response.body().string();
sendSuccess(baseCallBack,call,json);
}else {
int code=response.code();
ResponseBody body = response.body();
String string = body.string();
senFailure(baseCallBack,call,null,code+"----"+string);
}
}
});
}
private void doRequestForgettime(Request request, final BaseCallBack baseCallBack, final Context context){
// okHttpClient.newCall().execute();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
senFailure(baseCallBack,call, e,"未连接上服务器"+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
boolean successful = response.isSuccessful();
Headers headers = response.headers();
long clientTime = getDeltaBetweenServerAndClientTime(headers);//utc时间显示
LogUtils.wyjlog("clientTime"+clientTime);
SpUtils.saveString(context, SpConstant.TIMEESCAPE,clientTime+"");
if (successful){
String json = response.body().string();
sendSuccess(baseCallBack,call,json);
}else {
int code=response.code();
ResponseBody body = response.body();
String string = body.string();
senFailure(baseCallBack,call,null,code+"----"+string);
}
}
});
}
/**
* 获取差值
**/
private long getDeltaBetweenServerAndClientTime(Headers headers) {
long deltaBetweenServerAndClientTime=0;
if (headers!=null) {
final String strServerDate = headers.get("Date");
if (!TextUtils.isEmpty(strServerDate)){
// final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss 'GMT'", Locale.CHINA);
final SimpleDateFormat simpleDateFormat =new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.ENGLISH);
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
try {
Date serverDate = simpleDateFormat.parse(strServerDate);
deltaBetweenServerAndClientTime = serverDate.getTime()-new Date().getTime()+8*60*60*1000;
} catch (ParseException e) {
e.printStackTrace();
}
}
}
return deltaBetweenServerAndClientTime;
}
/**
* 请求成功的处理
* @param baseCallBack
* @param call
* @param json
*/
private void sendSuccess(final BaseCallBack baseCallBack, final Call call, final String json) {
handler.post(new Runnable() {
@Override
public void run() {
if (baseCallBack.type==String.class){
try {
baseCallBack.onSuccess(call,json);
} catch (Exception e) {
e.printStackTrace();
}
}else {
Object object = gson.fromJson(json, baseCallBack.type);
try {
baseCallBack.onSuccess(call,object);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
/**
* 请求失败的处理
* @param baseCallBack
* @param call
*
*/
private void senFailure(final BaseCallBack baseCallBack, final Call call, final IOException e, final String code) {
handler.post(new Runnable() {
@Override
public void run() {
baseCallBack.onFailure(call,e);
LogUtils.wyjlog("网络请求状态:"+code);
}
});
}
}
然后根据更新的需求:在主线程中更新,创建了一个BaseCallBack抽象类:
/**
* @创建者 wyj
* @创建时间 2017/4/514:09.
* @描述 回调
* @更新者 ${author}
* @更新时间 2017/4/514:09.
*/
public abstract class BaseCallBack<T> {
Type type;
static Type getSuperclassTypeParameter(Class<?> subclass)
{
Type superclass = subclass.getGenericSuperclass();
if (superclass instanceof Class)
{
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}
public BaseCallBack()
{
type = getSuperclassTypeParameter(getClass());
}
public abstract void onFailure(Call call, IOException e);
public abstract void onSuccess(Call call, T t) throws Exception;
}
还有些其他的用法可参看文章:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html