Android 你必须学会的okhttp3.0入门篇

简单说一下学习okhttp的理由

  1. google在Android 6.0中删除了HttpClient的Api,采用的是则是okhttp
  2. 高效的使用HTTP,使应用运行更快更省流量
  3. 响应缓存数据避免重复网络请求
  4. 无缝的支持GZIP来减少数据流量
  5. 使用非常简单,请求和响应的Api具有流畅的建造和不变性,同时支持同步异步调用回调函数
  6. 如果网络出现问题,它会从常见的连接问题中恢复
  7. 如果服务器配置有多个IP地址,当第一个IP连接失败,它会尝试连接下一个IP

以上是okhttp官网http://square.github.io/okhttp/以及结合网上的一些理解整理出来的,看到有不对的地方还望大家多多指出

下面我们就开始学习怎么使用okhttp吧

配置环境

github地址:https://github.com/square/okhttp

在builde.gradle里面添加上

compile 'com.squareup.okhttp3:okhttp:3.4.1'

在AndroidManifest.xml添加所需权限

<uses-permission android:name="android.permission.INTERNET" />

基本使用

  • get异步请求

通过get请求获取指定URL网页请求,这里要注意的是Android4.0以后需要在非主线程里使用。

private OkHttpClient client = new OkHttpClient();
public static void get(){
        //创建一个Request
        Request request = new Request.Builder()
                .url("http://www.jianshu.com/")
                .get()
                .build();
        //发起异步请求,并加入回调
        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call,IOException e){
                //请求失败回调
            }
            @Override
            public void onResponse(Call call,Response response) throws IOException{
                //请求成功回调
                Log.e("okHttp","get="+response.body().string());
            }
        });
    }
  • post异步请求
    private OkHttpClient client = new OkHttpClient();
    public static void post(){
        //创建Form表单对象,可以add多个键值队
        FormBody formBody = new FormBody.Builder()
                .add("param","value")
                .add("param","value")
                .build();
        //创建一个Request
        Request request = new Request.Builder()
                .url("http://www.jianshu.com/")
                .post(formBody)
                .build();
        //发起异步请求,并加入回调
        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call,IOException e){
            }
            @Override
            public void onResponse(Call call,Response response) throws IOException{
                Log.e("okHttp","post="+response.body().string());
            }
        });
    }
  • 同步请求

client.newCall(request).enqueue(new Callback())改成
client.newCall(request).execute().body().string()即可

  • 文件上传与多文件上传
    public static void upload(){
        //多个文件集合
        List<File> list = new ArrayList<>();
        MultipartBody.Builder builder = new MultipartBody.Builder();
        //设置为表单类型
        builder.setType(MultipartBody.FORM);
        //添加表单键值
        builder.addFormDataPart("param","value");
        for (File file : list) {
            //添加多个文件
            RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
            builder.addFormDataPart("files", file.getName(), fileBody);
        }
        Request request = new Request.Builder()
                .url("http://192.168.1.8/upload/UploadServlet")
                .post(builder.build())
                .build();
        //发起异步请求,并加入回调
        mOkHttpClient.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call,IOException e){
            }
            @Override
            public void onResponse(Call call,Response response) throws IOException{
                Log.e("okHttp","updLoad="+response.body().string());
            }
        });
    }
  • 超时设置,整个程序应使用这一个mOkHttpClient对象
    public static void setTimeout(){
        mOkHttpClient.newBuilder()
                .connectTimeout(10, TimeUnit.SECONDS)//10秒连接超时
                .writeTimeout(10, TimeUnit.SECONDS)//10m秒写入超时
                .readTimeout(10, TimeUnit.SECONDS)//10秒读取超时
                .build();
    }
  • 文件下载
    其实很简单,只需要利用get同步或异步请求,然后通过
    client.newCall(request).execute().body().byteStream()
    获取InputStream输入流,写文件操作即可实现文件下载。

好了,学到这里okhttp算是入门了,其实还有很多需要我们去学习的,例如缓存、授权证书、封装、用的过中碰到的一些情况等等,都需要我们进一步的了解和学习了,后面有时间我也会针对这些,写一篇okhttp进阶篇,还望大家能够多多关注。

好记性不如烂笔头!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,050评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 太长了,还是转载吧...今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源...
    庞哈哈哈12138阅读 20,100评论 3 283
  • 最近一次打电话给老爸,老爸说我种的葡萄今年长了很多葡萄,有上百串。老爸描述一个事情一向会略夸张,当时我没太在意,...
    公子远阅读 601评论 0 50
  • 读经典后对学习的直接作用是什么 很高兴与大家如期相约一起学习。父母好好学习,孩子天天向上,让我们每天在学习中成长,...
    子正书院阅读 368评论 0 0