新鲜的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
原创粉丝点击