最近很火的OkHttp剥洋葱系列

最近很火的OkHttp剥洋葱系列

最近因为Retrofit组合Rxjava系列火的不得了,我也是最近事情较少所以好好研究了一下这种组合。如果你不了解Retrofit你肯定会问跟我们今天说的OkHttp有什么关系:Retrofit内部使用OkHttp实现。当然如果只是因为Retrofit,那我们完全没有必要专门拿出一篇文章来写,毕竟安卓4.4开始Google开始将OkHttp整合到系统里面,为什么要整合OkHttp呢?我们来分析下。

首先列出来几个常用的请求框架吧:
1.HttpURLConnection
这个安卓自带的请求框架应该没什么好说了,总结一下就一个字 。当然它也是有优势的,身为基础的请求框架 可塑性很强。基本可以满足你开发的需求,但是代码冗余。
2.Volley
这个框架是我比较常用的,自Volley发布以来一直受大量程序旺的追捧,当然我也是其中一个旺。相比其他框架Volley采用链式请求,代码清晰简介易配置,而且解决了activity消失返回数据的处理问题。实为居家旅行必备良药。但是封装的越完善可塑性就越差,对于一个新手来说,修改Volley请求那叫一个苦逼,别问我为什么。
3.OkHttp
这个框架相比HttpURLConnection封装的要好一些,相比于Volley可塑性那是相当的好。
针对可塑性:HttpURLConnection>OkHttp>Volley
针对简易性:Volley>Okhttp>HttpURLConnection

究竟要用那个框架完全取决于你的项目需求。这里仅仅抛砖引玉

Android studio请引入(强烈建议使用AS):

compile 'com.squareup.okhttp:okhttp:2.4.0'

一,get请求

废话不多说先上代码

        OkHttpClient client = new OkHttpClient();
        //创建请求可以编辑请求的头 体 等 具体看类代码
        Request request = new Request.Builder()
                .url("")
                .addHeader("", "")
                .cacheControl(null)
                .build();
        Call call = client.newCall(request);

        //将线程加入调度,等待结果返回,注意回调函数运行在线程中
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {
                response.isSuccessful();//是否成功
                response.body().string();//返回参数
                response.body().byteStream();//获取流输入
            }
        });
        call.cancel();//取消请求调度

注意:回调函数试运行在线程中的!!!使用时请结合handler。这也就是为什么OkHttp会使用在Retrofit和Rxjava中。(具体请移步度娘)

二,post请求

废话不多说先上代码

        //方案一 使用json字符串提交数据
        OkHttpClient client = new OkHttpClient();
        MediaType type = MediaType.parse("application/json; charset=utf-8");
        String json = "";
        RequestBody body = RequestBody.create(type, json);
        Request request = new Request.Builder()
                .url("")
                .post(body)
                .build();
        Call call = client.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {

            }
        });

        //方案2 模拟表单提交post请求
        OkHttpClient client = new OkHttpClient();
        FormEncodingBuilder builder = new FormEncodingBuilder();
        builder.add("name", "value");
        RequestBody body = builder.build();
        Request request = new Request.Builder()
                .url("")
                .post(body)
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {

            }
        });

对于post请求来说大体就这两种写法,不同从根本上来说只是调用了不同的方法,接下来看源码:

  public RequestBody build() {
    if (content.size() == 0) {
      throw new IllegalStateException("Form encoded body must have at least one part.");
    }
    return RequestBody.create(CONTENT_TYPE, content.snapshot());
  }

FormEncodingBuilder 类的build()方法最终调用了RequestBody.create(CONTENT_TYPE, content.snapshot())方法,而 CONTENT_TYPE代码如下

private static final MediaType CONTENT_TYPE = MediaType.parse("application/x-www-form-urlencoded");

结果显而易见,那么也许有人问MediaType.parse():

 FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是“application/x-www-form-urlencoded”。
然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。
在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。
下面要讲到文件上传时"application/octet-stream",这是八进制的流。

三,文件上传

废话不多说先上代码

RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);

        RequestBody requestBody = new MultipartBuilder()
                .type(MultipartBuilder.FORM)
                .addFormDataPart("","",fileBody)
                .build();
        Request request = new Request.Builder()
                .url("")
                .post(requestBody)
                .build();

        Call call = client.newCall(request);
        call.enqueue(new Callback()
        {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {

            }
        });
### 回答1: 图灵所说的“剥洋葱皮”的方法是指,解决一个问题时,应该先将问题分解成若干个规模较小的子问题,然后逐一解决这些子问题。这种方法类似于剥洋葱的过程,因为洋葱的外皮是分层的,可以逐层剥开。这种方法通常被称为分治法。 ### 回答2: 图灵所说的“剥洋葱皮”的方法是一种解决问题的思维方式。他认为,当面对一个复杂的问题时,可以将它看作是一个多层次的问题,就像剥洋葱一样,一层一层地解决。 首先,我们需要将问题分解成多个子问题。这样可以让问题变得更加简单明了,便于分析和解决。就像剥掉洋葱的外层一样,我们首先要找到最外层的问题。 接下来,我们逐个解决这些子问题。图灵认为,解决问题的关键是找到适当的方法和技巧。就像剥洋葱一样,我们需要找到剥离每一层的最佳方式。这可能需要我们进行试错,使用不同的方法和工具,直到找到最适合的解决方案。 最后,我们要将所有子问题的解决方案整合在一起,得出最终的答案。这就像将剥离的洋葱层层叠加在一起,形成一个完整的洋葱。通过将每个子问题的解决方案相互关联,我们可以建立起一个全面而完善的解决方案。 图灵的“剥洋葱皮”的方法强调了问题解决的系统性和层次性。它提醒我们,在面对棘手的问题时,不要一味地追求简单快速的解决,而是应该用更加深入和全面的方式来思考。只有通过逐层分析和解决,才能找到最符合实际情况的解决方案。 ### 回答3: 图灵所说的“剥洋葱皮”的方法是一种在解决问题时逐层深入的途径。就像剥洋葱一样,我们需要逐层剥去表面的皮,去发现和理解问题的核心和更深层次的本质。 这种方法的关键是将复杂的问题分解为更小的部分,并逐步分析每个部分。每一层都像是一个迷宫,需要我们仔细探索和理解,以便找到问题的答案。 剥洋葱皮的方法有助于我们理清思路,使复杂的问题变得简单明了。通过逐层剥离,我们可以发现隐藏在问题内部的一些因素、关系和规律。这种逐层剥洋葱皮的思维方式帮助我们更好地组织和分析信息,找到解决问题的途径和策略。 同样,这种方法也适用于学习新的知识和技能。我们可以逐步理解和掌握基础概念,再逐渐拓展到更深层次的知识。通过不断学习和探索,我们可以迅速提高自己的能力,并更好地理解复杂的问题和挑战。 总之,图灵所说的“剥洋葱皮”的方法是一种层层深入的思维方式,通过分解问题和逐步分析来寻找解决问题的答案。无论是解决问题还是学习掌握新知识,这种方法都能帮助我们更好地理清思路,提高分析问题的能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值