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进入服务器数据获取和解析,同时也可以加入数据获取过程中的等待显示进度条的问题。