Android-网络框架01OKHttp3
2017-02-17 14:22
435 查看
OKHttp官网:https://github.com/square/okhttp
PersistentCookieJar官网:https://github.com/franmontiel/PersistentCookieJar
在Android4.4源码中,HttpURLConnection已经替换成OKHttp了
转载请注明出处 ethan_xue博客
post
基于Http的文件上传
文件下载
支持请求回调,直接返回对象,对象集合
支持Session保持
按照下面步骤简单几步使用起来。
说明:call.execute()为同步请求,基本不用,因为会阻塞UI线程,而是用call.enqueue异步请求数据。
使用enqueue方法,将call放入请求队列,然后okHttp会在线程池中进行网络访问;只需要在适当的时候(需要操作UI的时候)发送一个消息给主线程的Handler(取决于Looper,使用 Looper.getMainLooper()
创建的Handler就是主线程Handler)就可以了~
post
onResponse后,使用handler
或者使用runonUIthread();
android studio 引入库失败的话,可直接下载代码放到工程里
可参考的代码下载地址:http://download.csdn.net/detail/ethan_xue/9655282
PersistentCookieJar官网:https://github.com/franmontiel/PersistentCookieJar
在Android4.4源码中,HttpURLConnection已经替换成OKHttp了
本文的意义
简单3步实现okhttp的简单封装和使用,get和post。转载请注明出处 ethan_xue博客
功能
getpost
基于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)封装后的使用
getUtilsOKHttp.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持久化?
使用PersistentCookieJarcompile '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相关文章推荐
- Android 访问网络框架之——OkHttp框架的解析
- Android框架学习笔记01Okhttp框架
- android 网络框架解析--OKHttp
- Android 访问网络框架之——OkHttp框架的解析
- Android网络框架综述(一)OkHttp、NoHttp、Volley
- Android 网络框架(Android-async-http,OKHttp,retrofit,volley,xUtils,Afinal)
- Android网络请求框架—OKHttp 源码解析
- android网络请求框架的学习之路——浅谈对Volley,OkHttp,Retrofit的了解与对比
- Android 网络访问框架retrofit2,okhttp3之简单封装,kotlin源码
- Android网络框架-OkHttp使用
- Android从零开搞系列:网络框架系列(2)OkHttp+POST图片(下)
- android网络请求框架的学习之路——浅谈对Volley,OkHttp,Retrofit的了解与对比 标签: androidVolleyOkhttpRetrofit网络请求框架
- android 网络框架学习(okhttp,retrofit,rxjava)
- Android网络框架-OkHttp使用
- Android从零开搞系列:网络框架系列(1)OkHttp+可测试的服务器URL+Gson分析(上)
- Android----------OkHttp网络请求框架Get和Post简单封装(泛型)
- Android更好的扩展性更强网络请求框架----okhttp
- Android学习笔记02——OKHttp网络框架01
- Android网络框架之----OKHttp简单二次封装
- android网络请求框架的学习之路——浅谈对Volley,OkHttp,Retrofit的了解与对比