四、封装OkHttp

来源:互联网 发布:手机刷机数据恢复 编辑:程序博客网 时间:2024/06/06 21:07

网络请求使用OkHttp,至于为什么使用它,博客里已经有很多人说过它的优点了。

一、引入jar包

在build.gradle文件中加入一句即可

dependencies {    compile 'com.squareup.okhttp3:okhttp:3.4.1'}

二、代码封装

1、为了便于传递url参数,我们先封装url

public class KengHttpBuilder {    private StringBuffer url;    private Map<String, Object> data;    public KengHttpBuilder() {        data = new HashMap<>();        url = new StringBuffer();    }    public KengHttpBuilder put(String name, Object value) {        data.put(name, value);        return this;    }    public KengHttpBuilder url(String url) {        this.url.append(url);        return this;    }    public String getGetUrl() {        for (String key: data.keySet()) {            if (!url.toString().contains("?")) {                url.append("?").append(key).append("=").append(data.get(key));            } else {                url.append("&").append(key).append("=").append(data.get(key));            }        }        // TODO: 2016/7/28 打印url        return url.toString();    }}
2、自定义回调接口

public interface KengHttpCallback {    void onSuccess(JSONObject data);    void onFail(int code, String msg);}
3、处理http

public class KengHttpManager {    private static KengHttpManager mKengHttpManager;    private OkHttpClient mOkHttpClient;    private MyHandler mHandler;    private KengHttpManager() {        mOkHttpClient = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).build();        mHandler = new MyHandler();    }    public static KengHttpManager getInstance() {        if (mKengHttpManager == null) {            mKengHttpManager = new KengHttpManager();        }        return mKengHttpManager;    }    /**     * 异步http请求     * @param builder     * @param callback     */    public void callAsyn(KengHttpBuilder builder, final KengHttpCallback callback) {        final Request request = new Request.Builder().url(builder.getGetUrl()).build();        Call call = mOkHttpClient.newCall(request);        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                if (callback != null) {                    // TODO: 2016/7/28 打印回调                    HttpContent content = new HttpContent();                    content.callback = callback;                    content.code = KengHttpCode.HTTP_ERROR;                    content.msg = e.getMessage();                    mHandler.obtainMessage(HTTP_FAIL, content).sendToTarget();                }            }            @Override            public void onResponse(Call call, Response response) throws IOException {                if (callback != null) {                    JSONObject data = null;                    try {                        data = new JSONObject(response.body().string());                    } catch (JSONException e) {                        // TODO: 2016/7/28 log统一处理                        e.printStackTrace();                    }                    if (data.optInt("code") == KengHttpCode.HTTP_OK) {                        // TODO: 2016/7/28 打印回调                        HttpContent content = new HttpContent();                        content.callback = callback;                        content.msg = data.optString("data");                        mHandler.obtainMessage(HTTP_SUCCESS, content).sendToTarget();                    } else {                        // TODO: 2016/7/28 打印回调                        HttpContent content = new HttpContent();                        content.callback = callback;                        content.code = data.optInt("code");                        content.msg = data.optString("msg");                        mHandler.obtainMessage(HTTP_FAIL, content).sendToTarget();                    }                }            }        });    }    class MyHandler extends Handler {        public MyHandler() {            super(Looper.getMainLooper());        }        @Override        public void handleMessage(Message msg) {            HttpContent content = (HttpContent)msg.obj;            switch (msg.what) {                case HTTP_SUCCESS:                    try {                        content.callback.onSuccess(new JSONObject(content.msg));                    } catch (JSONException e) {                        // TODO: 2016/7/28 log统一处理                        e.printStackTrace();                    }                    break;                case HTTP_FAIL:                    content.callback.onFail(content.code, content.msg);                    break;            }        }    }    class HttpContent {        public int code;        public String msg;        public KengHttpCallback callback;    }    private static final int HTTP_SUCCESS = 200;    private static final int HTTP_FAIL = 300;}
4、封装http工具类,便于使用。这里有个小插曲,我把根路径设置为127.0.0.1的时候,访问不到我的本地服务器,改成我的IP之后就可以正常访问了。

public class HttpUtil {    public static String BASE_URL = "http://192.168.1.5/keng";    public static void sendRequest(KengHttpBuilder builder, KengHttpCallback callback) {        if (!NetworkUtil.isNetworkAvailable() && callback!=null) {            callback.onFail(KengHttpCode.HTTP_NEWWORK_ERROR, KengApplication.getInstance().getString(R.string.network_error));            return;        }        KengHttpManager.getInstance().callAsyn(builder, callback);    }}
5、调用http

public class MainActivity extends BaseActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        setMTATag("MainActivity");        KengHttpBuilder builder = new KengHttpBuilder();        builder.url(HttpUtil.BASE_URL + "/client/user_findNickname_j.ss");        builder.put("username","hy1");        HttpUtil.sendRequest(builder, new KengHttpCallback() {            @Override            public void onSuccess(JSONObject data) {                ((TextView)findViewById(R.id.tv_name)).setText(data.optString("nickname"));            }            @Override            public void onFail(int code, String msg) {                ((TextView)findViewById(R.id.tv_name)).setText(msg);            }        });    }}
6、查询结果


参考: http://blog.csdn.net/lmj623565791/article/details/47911083

            http://square.github.io/okhttp/#download

1 0
原创粉丝点击