Google貌似在6.0版本里面删除了HttpClient相关API,鉴于okhttp的口碑相当好,介绍一下OKHttp的安装及使用:

一.安装

对于Android Studio的用户,在Project Structure--->Dependencies 点击“+”号选Library dependency在搜索页面分别搜okttp,okio
注:okhttp内部依赖okio,别忘了同时导入okio
 
 

二.用法

(一)Http Get  Http Post

//创建okHttpClient对象,设置超时

 OkHttpClient mOKHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.build();

get、post请求除了请求体和请求方法不同,其他设置是相同的

首先说一下2.x到3.x关于POST请求的请求体类的改变:

在2.x中是 类名是:FormEncodingBuilder()

使用FormEncodingBuilder builder = new FormEncodingBuilder();  
builder.add("username","name");

在3.x中是 类名是: FormBody,但是一般使用是 RequestBody requestBodyPost = new FormBody.Builder()

需要说明一下FormBody是RequestBody的子类

本文采用3.x版本

 //    请求参数:page=1&code=news&pageSize=20&parentid=0&type=1
                RequestBody requestBodyPost = new FormBody.Builder()
                        .add("page", "1")
                        .add("code", "news")
                        .add("pageSize", "20")
                        .add("parentid", "0")
                        .add("type", "1")
                        .build();

默认请求方法是get方法,.get()可以省略

 Request request = new Request.Builder()
                        .get()
                        .url(GET_URL)
                        .build();
Request requestPost = new Request.Builder()
                        .url(POST_URL)
                        .post(requestBodyPost)
                        .build();

然后通过request的对象去构造得到一个Call对象

 //new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback()
        {
            @Override
            public void onFailure(Request request, IOException e)
            {
            }             @Override
            public void onResponse(final Response response) throws IOException
            {
                    //String htmlStr =  response.body().string();
            }
        });            

需要注意几点:

  • onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()

  • onResponse执行的线程并不是UI线程,如果你希望操作控件,还是需要使用handler,runOnUiThread等操作ui

(二)基于Http的文件上传

上传文件和一般的带参数post请求不同之处在于RequestBody的构建

RequestBody的Builder和type因版本而已,2.x叫做MultipartBuilder,3.x叫做MultipartBody.Builder()。当我们需要做类似于表单上传的时候,就可以使用它来构造我们的requestBody。此处以3.x为例

 File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");
if (!file.exists()) {
                    Toast.makeText(MainActivity.this, "文件不存在", Toast.LENGTH_SHORT).show();
                } else {
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
/* 2.x版本
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)*/
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
     .addPart(Headers.of(
          "Content-Disposition",
              "form-data; name=\"username\""),
          RequestBody.create(null, "cxc"))
    /* .addPart(Headers.of(
         "Content-Disposition",
         "form-data; name=\"mFile\";
         filename=\"wjd.mp4\""), fileBody)*/
.addFormDataPart("mFile", file.getName(), fileBody)
.addFormDataPart("thumb", file.getName(),
                RequestBody.create(MediaType.parse("image/*"), file));
//添加其他参数
.addFormDataPart(key, value);
     .build();
·····}

说明:

提交json数据,MediaType.parse("application/json; charset=utf-8");

上传图片,MediaType.parse("image/*");

提交String,MediaType.parse("text/x-markdown; charset=utf-8")

上传文件,MediaType.parse("application/octet-stream")

addPart和addFormDataPart方法本质是一样的

通过上面设置上传图片,MP3,小的文件都没问题。

本文为博主原创文章,请尊重版权,未经博主允许不得转载,转载请注明出处:http://www.cnblogs.com/details-666/p/OKHttp.html

带有进度监听的上传下载请参考http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0904/3416.html

浅谈Android studio中OKHttp安装及简单使用的更多相关文章

  1. 浅谈Android Studio中项目结构中project模式的各个文件和文件夹

    致敬郭霖,这些知识是从第一行代码第二版中直接码下来的,谢谢他,注意每个条目前是否有. 1..gradle和.idea 这两个目录下放置的都是Android Studio自动生成的一些文件,我们无需关心 ...

  2. android开发(0):android studio的下载安装与简单使用 | sdk的安装与编译运行

    android studio,简称AS,是集成开发环境,所谓集成,就是集编辑.编译.调试.打包等于一体.简单来说,通过AS,就可以开发出在android系统上运行的APP. 我使用的是macos系统. ...

  3. 浅谈Kotlin(一):简介及Android Studio中配置

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...

  4. 浅谈Windows下SVN在Android Studio中的配置、基本使用及解除关联

    看到网上很多关于svn环境配置和关联Android-Studio的很多博文,发现很零散,想集大家所长整理一下: 在AndroidStudio中开发版本控制中,除了Git就是SVN,和Eclipse不同 ...

  5. 【Android Studio安装部署系列】二十四、Android studio中Gradle插件版本和Gradle版本关系

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在从Android Studio3.0.0版本升级到Android Studio3.0.1版本的时候,出现了一个问题,需要升级Gra ...

  6. Android Studio中mac上面的安装

    Android Studio中mac上面的安装 学习了:https://blog.csdn.net/xianrenli38/article/details/79347170 http://www.an ...

  7. 浅谈Android系统开发中LOG的使用

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...

  8. 浅谈Android系统开发中LOG的使用【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以 ...

  9. 浅谈Android Studio3.0更新之路(遇坑必入)

    >可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...

随机推荐

  1. easyUI中datagrid的使用

    easyUI中的datagrid数据表格经常被用到,结合项目中的使用情况,总结一下datagrid使用中需要注意的一些问题.使用datagrid展示数据,需要在html.css.js中都要编写代码,h ...

  2. Java基础语法(一)<注释,关键字,常量,变量,数据类型,标识符,数据类型转换>

    从今天开始,记录学习Java的过程.要学习Java首先得有环境,至于环境的安装我就不说了,百度有很多教程,比如:http://jingyan.baidu.com/article/20095761904 ...

  3. 查询表达式和LINQ to Objects

    查询表达式实际上是由编译器“预处理”为“普通”的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的介绍 LINQ中的基础概念 降低两种数据 ...

  4. lightoj1336数论基础

    #include<iostream> #include<cstdio> #include<cmath> #define ll long long using nam ...

  5. 【vue系列之一】使用vue脚手架工具搭建vue-webpack项目

    对于Vue.js来说,如果你想要快速开始,那么只需要在你的html中引入一个<script>标签,加上CDN的地址即可.但是,这并不算是一个完整的vue实际应用.在实际应用中,我们必须要一 ...

  6. poj 1321 棋盘问题 简单DFS

    题目链接:http://poj.org/problem?id=1321 很久没有敲搜索了啊,今天敲了个水题练练手,哈哈.... 题目大意: 就是求在n*n的方格上放置k个棋子的方案数 代码: #inc ...

  7. HDU4704Sum 费马小定理+大数取模

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4704 题目大意: 看似复杂,其实就是求整数n的划分数,4=1+1+2和4=1+2+1是不同的.因而可 ...

  8. 关于开发微信小程序后端linux使用xampp配置https

    关于开发微信小程序后端linux使用xampp配置https 背景 由于最近开发微信小程序,前后端交互需要使用https协议,故需要配置https服务 服务器环境 服务器系统 ubuntu 环境 xa ...

  9. 微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索

    本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...

  10. GPIO控制LED

    一.LED灯的亮灭控制的配置步骤(GPIO4_D3): 1.GPIO4的CRU_CLKGATE_CON31时钟使能配置(用来保证GPIO4可写): io -4 0xff76037c 0xffff019 ...