新鲜的OkHttp

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值