新鲜的OkHttp
来源:互联网 发布:网络应用模型 编辑:程序博客网 时间:2024/04/28 13:54
OkHttp请求分为两种
(1)GET请求
(2)POST请求
(一)OkHttp请求的基本用法
GET请求,实例如下
private void getMsgFromNet() { OkHttpClient client = new OkHttpClient(); try { Request request = new Request.Builder().url(url).build(); //execute()是同步请求,会报错 Response response = client.newCall(request).execute(); Log.i("INFO=========GET", response.body().string()); //对服务器返回的String r= response.body().string()进行解析 processData(r); } catch (Exception e) { e.printStackTrace(); } }
POST请求
private void postMsgInfos() { OkHttpClient client = new OkHttpClient(); FormBody body = new FormBody.Builder() .add("page", page + "") .add("pageNumber", pageNumber + "") .add("status", status) .add("siteUserId", userId) .build(); Request request = new Request.Builder().url(url).post(body).build(); //采用异步请求,即不是在MainThread进行的 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String rr = response.body().string(); Log.i("INFO====POST", rr); processData(rr); } } }); }
(二)OkHttp的全能封装
1. 封装OkHttpHelper类
package com.example.http;import android.os.Handler;import android.os.Looper;import com.google.gson.Gson;import java.io.IOException;import java.lang.reflect.GenericArrayType;import java.util.Map;import okhttp3.Call;import okhttp3.Callback;import okhttp3.FormBody;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;import okio.BufferedSink;import static com.lidroid.xutils.http.client.HttpRequest.HttpMethod.GET;import static com.lidroid.xutils.http.client.HttpRequest.HttpMethod.POST;/** * Created by Administrator on 2016/10/27. */public class OkHttpHelper { private static OkHttpClient client; private Request.Builder builder; private Gson gson; private Handler mHandler; private OkHttpHelper() { client = new OkHttpClient(); builder = new Request.Builder(); gson = new Gson(); mHandler = new Handler(Looper.getMainLooper()); } public static OkHttpHelper getInstance() { return new OkHttpHelper(); } private void callbackSuccess(final BaseCallBack callback, final Response response, final Object object){ mHandler.post(new Runnable() { @Override public void run() { callback.onSucess(response,object); } }); } private void callbackError(final BaseCallBack callback, final Response response, final Exception e){ mHandler.post(new Runnable() { @Override public void run() { callback.onError(response,response.code(),e); } }); } public void get(String url, BaseCallBack callBack) { Request request = buildRequest(url, null, HttpMethodType.GET); doRequest(request, callBack); } public void post(String url, Map<String, String> params, BaseCallBack callBack) { Request request = buildRequest(url, params, HttpMethodType.POST); doRequest(request, callBack); } private Request buildRequest(String url, Map<String, String> params, HttpMethodType httpMethod) { builder.url(url); if (httpMethod == HttpMethodType.GET) { builder.get(); } else if (httpMethod == HttpMethodType.POST) { builder.post(buildRequestBody(params)); } return builder.build(); } private RequestBody buildRequestBody(Map<String, String> params) { FormBody.Builder builder = new FormBody.Builder(); if (params != null) { for (Map.Entry<String, String> entry : params.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } } return builder.build(); } enum HttpMethodType { GET, POST } private void doRequest(Request request, final BaseCallBack callback) { callback.onRequestBefore(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { callback.onFailure(call,e); } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){ String str = response.body().string(); if(callback.mType == String.class){ callbackSuccess(callback,response,str); }else{ try { Object obj = gson.fromJson(str,callback.mType); callbackSuccess(callback,response,obj); }catch (Exception e){ callbackError(callback,response,e); } } }else{ callbackError(callback,response,null); } } }); }}
2 回调接口BaseCallBack
package com.example.http;import com.google.gson.internal.$Gson$Types;import java.io.IOException;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import okhttp3.Call;import okhttp3.Response;/** * Created by Administrator on 2016/10/27. */public abstract class BaseCallBack <T>{ public Type mType; static Type getSuperclassTypeParameter(Class<?> subclass){ Type superclass = subclass.getGenericSuperclass(); if (superclass instanceof Class){ throw new RuntimeException("Missing type parameter.."); } ParameterizedType parameterizedType = (ParameterizedType) superclass; return $Gson$Types.canonicalize(parameterizedType.getActualTypeArguments()[0]); } public BaseCallBack(){ mType = getSuperclassTypeParameter(getClass()); } protected abstract void onRequestBefore(); protected abstract void onFailure(Call call, IOException e); protected abstract void onSucess(Response response,T t); protected abstract void onError(Response response,int code,Exception e);}
3 在代码中的调用
private void postW() { Map<String, String> params = new HashMap<String, String>(); params.put("page", page + ""); params.put("pageNumber", pageNumber + ""); params.put("status", status); params.put("siteUserId", userId); httpHelper.post(url, params, new BaseCallBack<VoucherListInfo2>() { @Override protected void onRequestBefore() { } @Override protected void onFailure(Call call, IOException e) { Log.e("====OKhttp=onFailure==", e.toString()); } @Override protected void onSucess(Response response, VoucherListInfo2 voucherListInfo2) { //此处是在主线程中进行的,可以进行UI等系列操作 Log.e("====OKhttp=onSucess==", voucherListInfo2.msg.size() + ""); if (voucherListInfo2.msg != null && voucherListInfo2.msg.size() != 0) { mData = voucherListInfo2.msg; mAdapter = new MyCommonAdapter<VoucherListInfo2.Msg>(mActivity, R.layout.item_voucherlist, mData) { @Override public void convert(MyCommonViewHolder holder, VoucherListInfo2.Msg s) { holder.setText(R.id.tv_number, s.voucherNumber); holder.setText(R.id.tv_price, s.price + ""); holder.setText(R.id.tv_state, s.status + ""); holder.setText(R.id.tv_useMoney, s.powerRule + ""); holder.setText(R.id.tv_startTime, s.startTime + ""); holder.setText(R.id.tv_endTime, s.endTime + ""); } }; mRecyclerView.setAdapter(mAdapter); } mSwipeRefreshLayout.setColorSchemeColors(Color.RED, Color.BLUE); } @Override protected void onError(Response response, int code, Exception e) { //此处也是UI线程,可以进行UI 等操作。 Log.e("====OKhttp=onError==", e.toString()+"===code="+code); } }); }
简简单单实现了OKHttp和Gson联合解析服务器数据。
(三). 优化————加入进度条
需要引入第三方库:spots-dialog ,github地址:https://github.com/d-max/spots-dialog
1 优化代码
引入新的回调类SpotsCallback ,
package com.example.http;import android.content.Context;import java.io.IOException;import dmax.dialog.SpotsDialog;import okhttp3.Call;import okhttp3.Response;import static android.icu.lang.UCharacter.GraphemeClusterBreak.T;/** * Created by Administrator on 2016/10/27. */public abstract class SpotsCallback<T> extends BaseCallBack<T> { private SpotsDialog dialog; public SpotsCallback(Context context){ dialog = new SpotsDialog(context); } private void showDialog(){ dialog.show(); } private void dismissDialog(){ if(dialog!=null){ dialog.dismiss(); } } private void setMessage(String msg){ dialog.setMessage(msg); } @Override protected void onRequestBefore() { showDialog(); } @Override protected void onFailure(Call call, IOException e) { dismissDialog(); } @Override protected void onResponse(Response response) { dismissDialog(); }}
2.在BaseCallBack中添加回调,修改如下,
protected abstract void onResponse(Response response);
3 在OkHttpHelper中修改如下.
private void doRequest(Request request, final BaseCallBack callback) { callback.onRequestBefore(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { callback.onFailure(call,e); } @Override public void onResponse(Call call, Response response) throws IOException { **callback.onResponse(response);** if(response.isSuccessful()){ String str = response.body().string(); if(callback.mType == String.class){ callbackSuccess(callback,response,str); }else{ try { Object obj = gson.fromJson(str,callback.mType); callbackSuccess(callback,response,obj); }catch (Exception e){ callbackError(callback,response,e); } } }else{ callbackError(callback,response,null); } } }); }}
4.在MainActivity调用时修改如下
**httpHelper.post(url, params, new SpotsCallback<VoucherListInfo2>(VoucherListActivity.this) {** @Override protected void onSucess(Response response, VoucherListInfo2 voucherListInfo2) { Log.e("====OKhttp=onSucess==", voucherListInfo2.msg.size() + ""); if (voucherListInfo2.msg != null && voucherListInfo2.msg.size() != 0) { mData = voucherListInfo2.msg; mAdapter = new MyCommonAdapter<VoucherListInfo2.Msg>(mActivity, R.layout.item_voucherlist, mData) { @Override public void convert(MyCommonViewHolder holder, VoucherListInfo2.Msg s) { holder.setText(R.id.tv_number, s.voucherNumber); holder.setText(R.id.tv_price, s.price + ""); holder.setText(R.id.tv_state, s.status + ""); holder.setText(R.id.tv_useMoney, s.powerRule + ""); holder.setText(R.id.tv_startTime, s.startTime + ""); holder.setText(R.id.tv_endTime, s.endTime + ""); } }; mRecyclerView.setAdapter(mAdapter); } mSwipeRefreshLayout.setColorSchemeColors(Color.RED, Color.BLUE); } @Override protected void onError(Response response, int code, Exception e) { Log.e("====OKhttp=onError==", e.toString()+"===code="+code); } }); }
这样之后可能会报错,需要在manifest文件中加入如下两行
<manifest xmlns:android="http://schemas.android.com/apk/res/android"//此行会自动生成的 **xmlns:tools="http://schemas.android.com/tools"** package="com.example.myapplication"> <uses-permission android:name="android.permission.INTERNET" /> **<uses-sdk tools:overrideLibrary="dmax.dialog" />**
到此为止,我们可以完美的使用OkHttp进入服务器数据获取和解析,同时也可以加入数据获取过程中的等待显示进度条的问题。
0 0
- 新鲜的OkHttp
- 怪新鲜的
- 新鲜的单片机
- 新鲜....
- 新鲜
- 新鲜
- 新鲜
- 新鲜
- 新鲜~
- 新鲜
- 新鲜
- 新鲜的有意义的事物
- 新鲜出炉的冷知识
- 新鲜草莓的花样吃法
- 缓存的新鲜度判断
- iOS新鲜的AFNetworking3使用方法
- 一段新鲜但又不该新鲜的Java代码。
- 几个有趣的Google新鲜技巧玩法
- 【kruskal算法】 苗条的生成树
- (Leetcode) Compare Version Numbers --- 比较版本号
- 数据库优化相关建议
- 自己写Java Web遇到的坑(2)——删除cookie时删不掉
- JavaWeb中浏览器URL编码,GET乱码问题方式乱码解决
- 新鲜的OkHttp
- 将元素添加进数组,再取得最大值和平均值
- JavaScript跑马灯
- hadoop mapreduce做数据排序
- 网页版直播和聊天室
- Starting MySQL...The server quit without updating PID file [FAILED]cal/mysql/data/sdzn-cdh02.zhiyoub
- Android中Rect和RectF的区别与联系
- cocopods使用
- 各种开源框架