okhttp 常用使用方式 封装 演示
工具介绍
使用:
- AndroidStudio:【compile 'com.squareup.okhttp3:okhttp:3.4.2'】和【compile 'com.zhy:okhttputils:2.6.2'】和【compile 'com.google.code.gson:gson:2.3.1'】
- eclipse:添加okthttp、okio、gson的jar包,复制okhttputils的源码到项目中
![]()
封装的功能
- 一般的get请求
- 一般的post请求
- 基于Http Post的文件上传(类似表单)
- 文件下载/加载图片
- 上传下载的进度回调
- 支持取消某个请求
- 支持自定义Callback
- 支持HEAD、DELETE、PATCH、PUT
- 支持session的保持
- 支持自签名网站https的访问,提供方法设置下证书就行
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />android:name="com.bqt.okhttp.MyApplication"
Application
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();//对于Https,框架中提供了一个类HttpsUtils,可设置为:可访问所有的https网站、设置具体的证书、双向认证//同样的,框架中只是提供了几个实现类,你可以自行实现SSLSocketFactory,传入sslSocketFactory方法中即可HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);//对于cookie,直接通过cookiejar方法配置,当然也可以自己实现CookieJar接口,编写cookie管理相关代码。//对于持久化cookie,还可以使用https://github.com/franmontiel/PersistentCookieJar.相当于框架中只是提供了几个实现类,你可以自行定制或者选择使用// ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(getApplicationContext()));// CookieJarImpl cookieJar = new CookieJarImpl(new MemoryCookieStore());OkHttpClient okHttpClient = new OkHttpClient.Builder()//.connectTimeout(10000L, TimeUnit.MILLISECONDS)//.readTimeout(10000L, TimeUnit.MILLISECONDS)////对于Log,初始化OkhttpClient时,通过设置拦截器实现,框架中提供了一个LoggerInterceptor,当然你可以自行实现一个Interceptor.addInterceptor(new LoggerInterceptor("TAG"))//// .cookieJar(cookieJar).hostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}})//.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)//.build();//默认情况下,将直接使用okhttp默认的配置生成OkhttpClient,如果有任何配置,记得在Application中调用initClient方法进行设置。OkHttpUtils.initClient(okHttpClient);}}
MainActivity
public class MainActivity extends ListActivity {private User mUser;private String user = "103468";private String pass = "103468";private String session_id;private String uid;private String mBaseUrl = "http://tapi.95xiu.com/";private TextView mTv;private ImageView mImageView;private ProgressBar mProgressBar;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);String[] array = { "post方式提交键值对数据", "get方式提交键值对数据", "post方式提交键值对数据文件", "post方式提交文件",//"post方式提交Json数据", "get方式获取图片", "get方式下载文件", "清除Session", };for (int i = 0; i < array.length; i++) {array[i] = i + "、" + array[i];}mTv = new TextView(this);// 将内容显示在TextView中mTv.setTextColor(Color.BLUE);mTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);mTv.setPadding(20, 10, 20, 10);mImageView = new ImageView(this);mProgressBar = new ProgressBar(this);mProgressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);mProgressBar.setMax(100);getListView().addFooterView(mProgressBar);getListView().addFooterView(mTv);getListView().addFooterView(mImageView);setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {switch (position) {case 0:postWithParams(); //post方式提交键值对数据break;case 1:getWithParams(); //get方式提交键值对数据break;case 2:postParamsAndFile(); //post方式提交键值对数据,同时提交文件break;case 3:postFile();//post方式提交文件---------------------用不到break;case 4:postJson();//post方式提交Json数据break;case 5:getImage();//get方式获取图片break;case 6:downloadFile();//get方式下载文件break;case 7:clearSession();//清除Sessionbreak;}}//post方式提交键值对数据public void postWithParams() {String url = mBaseUrl + "user/loginv2.php";OkHttpUtils.post().url(url).addParams("user", user).addParams("pass", pass).build().execute(new StringCallback() {@Overridepublic void onBefore(Request request, int id) {mTv.setText("onBefore...\n\n");}@Overridepublic void onAfter(int id) {mTv.append("onAfter...");}@Overridepublic void onError(Call call, Exception e, int id) {e.printStackTrace();mTv.append("onError:" + e.getMessage() + "\n\n");}@Overridepublic void onResponse(String response, int id) {mTv.append(response + "\n\n");Log.i("bqt", response);mUser = new Gson().fromJson(response, User.class);uid = mUser.getMsg().getId();session_id = mUser.getMsg().getSession_id();}});}//get方式提交键值对数据public void getWithParams() {String url = mBaseUrl + "app/news/index.php";OkHttpUtils.get().url(url).id(100).addParams("session_id", session_id).addParams("uid", uid).build().execute(new MyStringCallback());}//post方式提交键值对数据,同时提交文件public void postParamsAndFile() {String url = mBaseUrl + "myprofile/editinfo.php";File file = new File(Environment.getExternalStorageDirectory(), "bqt.jpg");if (!file.exists()) {Toast.makeText(MainActivity.this, "文件不存在,请修改文件路径", Toast.LENGTH_SHORT).show();return;}Map<String, String> params = new HashMap<>();params.put("session_id", session_id);params.put("uid", uid);OkHttpUtils.post().addFile("image", "文件名", file).url(url).params(params).build().execute(new MyStringCallback());//可以提交多个文件}//post方式提交文件---------------------用不到public void postFile() {String url = "http://app.fulijr.com/api/v1.3.4/a61000b6a80a";File file = new File(Environment.getExternalStorageDirectory(), "bqt.jpg");if (!file.exists()) {Toast.makeText(MainActivity.this, "文件不存在,请修改文件路径", Toast.LENGTH_SHORT).show();return;}OkHttpUtils.postFile().url(url).file(file).build().execute(new MyStringCallback());}//post方式提交Json数据public void postJson() {String url = mBaseUrl + "user/loginv2.php";OkHttpUtils.postString().url(url).mediaType(MediaType.parse("application/json; charset=utf-8")).content(new Gson().toJson(mUser)).build().execute(new MyStringCallback());}//get方式获取图片public void getImage() {String url = "http://d.hiphotos.baidu.com/image/pic/item/e4dde71190ef76c6cc15d5839816fdfaae516756.jpg";OkHttpUtils.get().url(url).tag(this).build().connTimeOut(20000).readTimeOut(20000).writeTimeOut(20000)//.execute(new BitmapCallback() {@Overridepublic void onError(Call call, Exception e, int id) {mTv.setText("onError:" + e.getMessage());}@Overridepublic void onResponse(Bitmap bitmap, int id) {mImageView.setImageBitmap(bitmap);}});}//get方式下载文件public void downloadFile() {String url = "http://d.hiphotos.baidu.com/image/pic/item/e4dde71190ef76c6cc15d5839816fdfaae516756.jpg";String filePath = Environment.getExternalStorageDirectory().getAbsolutePath();OkHttpUtils.get().url(url).build().execute(new FileCallBack(filePath, "包青天.jpg") {@Overridepublic void onBefore(Request request, int id) {mTv.setText("onBefore...\n\n");}@Overridepublic void onAfter(int id) {mTv.append("onAfter...");}@Overridepublic void inProgress(float progress, long total, int id) {mProgressBar.setProgress((int) (100 * progress));mTv.append(progress + "\n");}@Overridepublic void onError(Call call, Exception e, int id) {e.printStackTrace();mTv.append("onError:" + e.getMessage() + "\n\n");}@Overridepublic void onResponse(File file, int id) {mTv.append(file.getAbsolutePath() + "\n\n");}});}//清除Sessionpublic void clearSession() {CookieJar cookieJar = OkHttpUtils.getInstance().getOkHttpClient().cookieJar();if (cookieJar instanceof CookieJarImpl) {((CookieJarImpl) cookieJar).getCookieStore().removeAll();}}//其他请求方式public void otherRequestDemo() {//also can use delete ,head , patchOkHttpUtils.put().url("http://11111.com").requestBody("may be something").build()//.execute(new MyStringCallback());try {OkHttpUtils.head().url("http://11111.com").addParams("name", "zhy").build().execute();} catch (IOException e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();OkHttpUtils.getInstance().cancelTag(this);}public class MyStringCallback extends StringCallback {@Overridepublic void onError(Call call, Exception e, int id) {e.printStackTrace();mTv.setText("onError:" + e.getMessage());}@Overridepublic void onResponse(String response, int id) {mTv.setText("onResponse:" + decodeUnicodeToString(response));}}/**将Unicode编码解析成字符串形式(如汉字) */public static String decodeUnicodeToString(String uString) {StringBuilder sb = new StringBuilder();int i = -1, pos = 0;while ((i = uString.indexOf("\\u", pos)) != -1) {sb.append(uString.substring(pos, i));if (i + 5 < uString.length()) {pos = i + 6;sb.append((char) Integer.parseInt(uString.substring(i + 2, i + 6), 16));}}sb.append(uString.substring(pos));return sb.toString();}}
附件列表
okhttp 常用使用方式 封装 演示的更多相关文章
- Visaul Studio 常用快捷键的动画演示
从本篇文章开始,我将会陆续介绍提高 VS 开发效率的文章,欢迎大家补充~ 在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以 ...
- SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)
做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...
- 前后端常用通讯方式-- ajax 、websocket
一.前后端常用通讯方式 1. ajax 浏览器发起请求,服务器返回数据,服务器不能主动返回数据,要实现实时数据交互只能是ajax轮询(让浏览器隔个几秒就发送一次请求,然后更新客户端显示.这种方式实际 ...
- 常用js方法封装
常用js方法封装 var myJs = { /* * 格式化日期 * @param dt 日期对象 * @returns {string} 返回值是格式化的字符串日期 */ getDates: fun ...
- 用DLL方式封装MDI子窗体
用DLL方式封装MDI子窗体是一种常用的软件研发技术,他的长处: 研发人员能够负责某一个模块的编写包括(界面+逻辑),能够互不干扰,模块研发完成后,主程式统一调用. 易于程式升级,当程式升级时,不用编 ...
- 十一 三种Struts2的数据封装方式,封装页面传递的数据
Struts2的数据封装:Struts2是一个web层框架,框架是软件的半成品.提供了数据封装的基本功能. 注:Struts2底层(核心过滤器里面的默认栈里面的拦截器,具体见struts-defaul ...
- 用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。
Vue3 的父子组件传值.绑定表单数据.UI库的二次封装.防抖等,想来大家都很熟悉了,本篇介绍一种使用 Typescript 的方式进行统一的封装的方法. 基础使用方法 Vue3对于表单的绑定提供了一 ...
- jQuery中ajax的4种常用请求方式
jQuery中ajax的4种常用请求方式: 1.$.ajax()返回其创建的 XMLHttpRequest 对象. $.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数 ...
- iOS代码加密常用加密方式
iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...
随机推荐
- PHP数据学习-二维数组【3】
<?php // $project = array( // array("bai",12,23.0), // array("zeng",34,12.0), ...
- Python自动化运维之24、JQuery
jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多).它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, ...
- 安卓SDK Manager自动管理各种包
安卓ADT不能自动从google下载sdk等各种工具 修改hosts文件下载成功 210.242.125.89 dl-ssl.google.com 210.242.125.89 dl.google ...
- 学会爱上iOS自动布局(Auto Layout) - 剑尖
本文翻译自Yari Dareglia的LEARN TO LOVE AUTO LAYOUT文章先生们,女士们,让我们以正确的心态开始本教程吧:自动布局就是简单!我花了一段时间来掌握自动布局是如何工作的, ...
- sdk manager更新失败,显示Download interrupted: read timed out,应该如何解决?
今天开始第一天学习Android,就遇到一个大问题.sdk manager无法自动更新,总在提示超时!!! 经过网上查询发现问题原因是. 在利用android sdk manager更新时失败,具体情 ...
- LINUX单网卡绑定多个IP
在linux下,我们有时候需要给单网卡设置不同的IP地址,这样就涉及到单网卡绑定多个IP地址的情况.使用本方法可以方便的为单网卡绑定多个IP地址.笔者使用的环境是centos5.6,应该在fedora ...
- JS添加删除一组文本框并对输入信息加以验证
在做项目中遇到这样一个问题,就是我们需要添加几组数据到数据库,但是具体几组数据不确定,有客户来填写,比如我们需要添加打折策略,可能个策略有很多组方案,比如“满100打5折,满200打4折,满500打3 ...
- Java---对象与类的封装
一.类和对象: package cn.hncu.Myclasslearn; /** * * @author hncu_chx * * Mylove amin */ /**类是一种数据类型,声明一个类就 ...
- floyd详解
就不在来回搬了 请看 http://note.youdao.com/groupshare/?token=6422E952998F4381A1534B71359EFA57&gid=1579165 ...
- 《University Calculus》-chape4-导数的应用-洛必达法则
在求解极限的时候,我们常会遇到0/0型的不定式而无法进一步的求解极限,而洛必达法则就是用于处理这样的特定情况. 洛必达法则: 其证明过程要基于柯西中值定理(在该专栏的微分中值定理中给出). 证明:

