Android-网络框架01OKHttp3

OKHttp官网:https://github.com/square/okhttp
PersistentCookieJar官网:https://github.com/franmontiel/PersistentCookieJar
在Android4.4源码中,HttpURLConnection已经替换成OKHttp了

本文的意义

简单3步实现okhttp的简单封装和使用,get和post。
转载请注明出处 ethan_xue博客

功能

  • get
  • post
  • 基于Http的文件上传
  • 文件下载
  • 支持请求回调,直接返回对象,对象集合
  • 支持Session保持

具体步骤

使用方法可查看官网。
按照下面步骤简单几步使用起来。
说明:call.execute()为同步请求,基本不用,因为会阻塞UI线程,而是用call.enqueue异步请求数据。
使用enqueue方法,将call放入请求队列,然后okHttp会在线程池中进行网络访问;只需要在适当的时候(需要操作UI的时候)发送一个消息给主线程的Handler(取决于Looper,使用 Looper.getMainLooper()
创建的Handler就是主线程Handler)就可以了~

(1)添加网络访问权限并添加库依赖
<uses-permission android:name="android.permission.INTERNET" />
compile 'com.squareup.okhttp3:okhttp:3.4.1'
(2)简单封装GET和POST
public class UtilsOKHttp {

    private OkHttpClient client;
    private volatile static UtilsOKHttp manager;
    private Handler handler;

    private UtilsOKHttp() {
        client = new OkHttpClient();
        handler = new Handler(Looper.getMainLooper());
    }

    public static UtilsOKHttp getInstance() {
        if (manager == null) {
            manager = new UtilsOKHttp();
        }
        return manager;
    }

    public void get(String url, final OKCallback callBack) {
        get(url, null, callBack);
    }

    public void get(String url, HashMap<String, String> params, final OKCallback callBack) {
        if (params != null && params.size() > 0) {
            url = makeGetUrl(url, params);
        }
        final Request request = new Request.Builder().url(url).get().build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                onFailJsonStringMethod("请求失败", callBack);
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                if (response != null && response.isSuccessful()) {
                    onSuccessJsonStringMethod(response.body().string(), callBack);
                } else {
                    onFailJsonStringMethod("请求失败", callBack);
                }
            }
        });
    }

    /**
     * post 模拟表单提交
     */
    public void post(String url, HashMap<String, String> params, final OKCallback callBack) {
        FormBody.Builder form_builder = new FormBody.Builder();//表单对象,包含以input开始的对象,以html表单为主
        if (params != null && !params.isEmpty()) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                form_builder.add(entry.getKey(), entry.getValue());
            }
        }
        RequestBody request_body = form_builder.build();
        Request request = new Request.Builder().url(url).post(request_body).build();//采用post方式提交
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                onFailJsonStringMethod("请求失败", callBack);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response != null && response.isSuccessful()) {
                    onSuccessJsonStringMethod(response.body().string(), callBack);
                } else {
                    onFailJsonStringMethod("请求失败", callBack);
                }
            }
        });
    }

    /**
     * 请求返回的结果是json字符串
     *
     * @param jsonValue
     * @param callBack
     */
    private void onSuccessJsonStringMethod(final String jsonValue, final OKCallback callBack) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                if (callBack != null) {
                    try {
                        callBack.onSuccess(jsonValue);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            }
        });
    }

    private void onFailJsonStringMethod(final String str, final OKCallback callBack) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                if (callBack != null) {
                    try {
                        callBack.onFail(str);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            }
        });
    }

    public interface OKCallback {
        void onSuccess(String result);

        void onFail(String failResult);
    }

    /**
     * 拼接get的url
     *
     * @param params
     * @return
     */
    private String makeGetUrl(String oldUrl, HashMap<String, String> params) {
        String url = oldUrl;
        // 添加url参数
        if (params != null) {
            Iterator<String> it = params.keySet().iterator();
            StringBuffer sb = null;
            while (it.hasNext()) {
                String key = it.next();
                String value = params.get(key);
                if (sb == null) {
                    sb = new StringBuffer();
                    sb.append("?");
                } else {
                    sb.append("&");
                }
                sb.append(key);
                sb.append("=");
                sb.append(value);
            }
            url += sb.toString();
        }
        return url;
    }
}
(3)封装后的使用

get

UtilsOKHttp.getInstance().get("http://www.baidu.com", new UtilsOKHttp.OKCallback() {
            @Override
            public void onSuccess(String result) {
                    // xxx
            }

            @Override
            public void onFail(String result) {

            }
        });

post

HashMap<String, String> params = new HashMap<>();
params.put("username", login_user_et.getText().toString().trim());
params.put("password", login_pwd_et.getText().toString().trim());
UtilsOKHttp.getInstance().post("http://www.baidu.com", params, new UtilsOKHttp.OKCallback() {
            @Override
            public void onSuccess(String result) {
                   //xxx
            }

            @Override
            public void onFail(String failResult) {

            }
        });

Q&A

问题1:CalledFromWrongThreadException怎么破?

分析:从错误的线程调用,是因为在主线程中操作UI,这在Android中是不允许的,所以需要切换到主线程中进行UI操作。
onResponse后,使用handler

@Override
        public void onResponse(Call call, Response response) throws IOException {
            Message msg = new Message();
            msg.what=0;
            msg.obj = response.body().string();
            mHandler.sendMessage(msg);
        }
/
mHandler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(Message msg) {
            mTxt.setText((String) msg.obj);
        }
    };

或者使用runonUIthread();

runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textview.setText("xxx");
                    }
                });
问题2:如何实现Cookies持久化?

使用PersistentCookieJar

compile 'com.github.franmontiel:PersistentCookieJar:v1.0.0'

android studio 引入库失败的话,可直接下载代码放到工程里

ClearableCookieJar cookieJar =
                new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(cookieJar)
                .build();

可参考的代码下载地址:http://download.csdn.net/detail/ethan_xue/9655282

参考

http://www.qingpingshan.com/rjbc/az/110232.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值