OKHttp的容易使用

OKHttp的简单使用

一方面,最近关于OKHttp的讨论甚嚣尘上,另一方面,我最近也更新了android6.0,发现在6.0中HttpClient不能使用了,于是决定抽时间也看一下OKHttp,总结了一点东西,与大家分享。

以前读书的时候在学校用过GitHub上的一个开源控件AsyncHttpClient,当时解决了不少问题,上传图片以及download都能实现,感觉还不错,这次看完OKHttp,暂未发现两者在功能上的差异(如果哪位小伙伴发现了可以告诉我一下)。

官网对OKHttp的介绍还是比较详细,英文好的同学可以直接看官网的内容。使用OKHttp我们就需要OKHttp的jar包,同时由于OKHttp依赖于Okio,我们也需要下载Okio的jar包。这两个准备工作做好了就可以开始了。



一、发送Get请求

Request是OKHttp访问的请求,Callback是回调,有两种调用方式,一种是call.execute,这种方式不会开启新的线程,要在android中使用这个需要自己开启一个新线程,然后在线程中调用这个东西,这样反而麻烦了,所以个人推荐使用call.enqueue,call.enqueue会开启一个新的线程,在新线程中调用网络请求。这样的话我们就得通过Handler来与android UI交互了。

        okHttpClient = new OkHttpClient();
        request = new Request.Builder().url(HTTPURL).build();
        Call call = okHttpClient.newCall(request);
        // 开启异步线程访问网络
        call.enqueue(new Callback() {

            @Override
            public void onResponse(Response response) throws IOException {
                String res = response.body().string();
                Message msg = new Message();
                msg.what = REFRESHDATA;
                msg.obj = res;
                mHandler.sendMessage(msg);
            }

            @Override
            public void onFailure(Request arg0, IOException arg1) {

            }
        });


二、发送POST请求

发送POST请求,一种是提交JSON数据:

MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(JSON,
                "{\"username\":\"lisi\",\"nickname\":\"李四\"}");
        Request request = new Request.Builder().url(HTTPURL).post(body).build();
        //后面的调用与GET相同

还有一种是提交键值对:

RequestBody formBody = new FormEncodingBuilder()
                .add("username", "lisi").add("nickname", "李四").build();
        Request request = new Request.Builder().url(HTTPURL).post(formBody)
                .build();


总结

其实OKHttp相对于HttpURLConnection已经简单了许多,但是我还是觉得麻烦,而且官方亦不建议我们创建多个OkHttpClient实例,于是又对它进行了一层简单的封装。

import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

/**
 * OKHttp封装工具类
 *
 * @author wangsong
 *
 *         2015-10-9
 */
public class OKHttpUtils {

    private final static OkHttpClient M_OK_HTTP_CLIENT = new OkHttpClient();
    static {
        M_OK_HTTP_CLIENT.setConnectTimeout(30, TimeUnit.SECONDS);
    }

    /**
     * 不开启异步线程
     *
     * @author wangsong 2015-10-9
     * @param request
     * @return
     * @throws IOException
     */
    public static Response execute(Request request) throws IOException {
        return M_OK_HTTP_CLIENT.newCall(request).execute();
    }

    /**
     * 开启异步线程访问,访问结果自行处理
     *
     * @author wangsong 2015-10-9
     * @param request
     * @param responseCallback
     */
    public static void enqueue(Request request, Callback responseCallback) {
        M_OK_HTTP_CLIENT.newCall(request).enqueue(responseCallback);
    }
    /**
     * 开启异步线程访问,不对访问结果进行处理
     *
     * @author wangsong 2015-10-9
     * @param request
     * @param responseCallback
     */
    public static void enqueue(Request request) {
        M_OK_HTTP_CLIENT.newCall(request).enqueue(new Callback() {

            @Override
            public void onResponse(Response arg0) throws IOException {
            }

            @Override
            public void onFailure(Request arg0, IOException arg1) {
            }
        });
    }

    /**
     * 为HttpGet请求拼接一个参数
     *
     * @author wangsong 2015-10-9
     * @param url
     * @param name
     * @param value
     */
    public static String jointURL(String url, String name, String value) {
        return url + "?" + name + "=" + value;
    }

    /**
     * 为HttpGet请求拼接多个参数
     *
     * @author wangsong 2015-10-9
     * @param url
     * @param name
     * @param value
     */
    public static String jointURL(String url, Map<String, String> values) {
        StringBuffer result = new StringBuffer();
        result.append(url).append("?");
        Set<String> keys = values.keySet();
        for (String key : keys) {
            result.append(key).append("=").append(values.get(key)).append("&");
        }
        return result.toString().substring(0, result.toString().length()-1);
    }

}


本文涉及到的工具类下载地址https://github.com/lenve/OKHttpUtils

时间: 2024-10-12 13:07:42

OKHttp的容易使用的相关文章

Rxjava+ReTrofit+okHttp深入浅出-终极封装

Rxjava+ReTrofit+okHttp深入浅出-终极封装 背景: 学习Rxjava和retrofit已经很长时间了,功能确实很强大,但是使用起来还是有点复杂,代码的重复性太高,所以决定把基于retrofit和rxjava的处理统一封装起来,实现的功能: 1.Retrofit+Rxjava+okhttp基本使用方法 2.统一处理请求数据格式 3.统一的ProgressDialog和回调Subscriber处理 4.取消http请求 5.预处理http请求 5.返回数据的统一判断 效果: 封装

一、OkHttp请求方法

OkHttp是一个高效的HTTP库: 支持 SPDY ,共享同一个 Socket 来处理同一个服务器的所有请求 如果 SPDY 不可用,则通过连接池来减少请求延时 无缝的支持GZIP来减少数据流量 缓存响应数据来减少重复的网络请求 OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复.如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP.OkHttp还处理了代理服务器问题和SSL握手失败问题. OkHttp是一个相对成熟的解决方案,据说

OkHttp介绍

Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient,HttpURLConnection相对来说比HttpClient难用,google自从2.3版本之后一直推荐使用HttpURLConnection,并且在6.0版本的sdk中直接删掉了HttpClient类. 但是, 上面两个类库和OkHttp比起来就弱爆了, 因为OkHttp不仅具有高效的请求效率,并且节省宽带, 还提供了很多开箱即用的网络疑难杂症解决方案.(据说Android4.4的源码中可

Android实际开发之网络请求组件的封装(OkHttp为核心)

趁周末时间撸了两天代码,将OkHttp网络请求框架进行了一次简单封装,对于实际开发非常有用.. 此次封装主要针对我们经常使用的网络请求的步骤进行封装,在已有框架OkHttp的基础上进行实际开发的封装 发送一个网络请求,有以下三个功能模块: 一:request处理 二:OkHttp核心处理 三:callback处理 我们进行网络请求组件的封装也是根据这三大模块进行封装的,下面规划一下这次封装的一个思维导图: 根据以上思维导图,我们第一步,先进行request的封装: 以下是封装的一个CommonR

OkHttp使用方法

1.在app/build.gradle中添加依赖 compile 'com.squareup.okhttp3:okhttp:4.0.1' 2.创建OkHttpClient实例 OkHttpClient client = new OkHttpClient(); 3.发送HTTP请求 Request request = new Request.Builder().build(); 上述只是创建了一个空的Request,可以在.build()方法前连缀很多其他方法. 4.发送请求,并获取服务器返回的数

okhttp实现断点上传

前言 之前项目需要上传大文件的功能,上传大文件经常遇到上传一半由于网络或者其他一些原因上传失败.然后又得重新上传(很麻烦),所以就想能不能做个断点上传的功能.于是网上搜索,发现市面上很少有断点上传的案例,有找到一个案例也是采用SOCKET作为上传方式(大文件上传,不适合使用POST,GET形式).由于大文件夹不适合http上传的方式,所以就想能不能把大文件切割成n块小文件,然后上传这些小文件,所有小文件全部上传成功后再在服务器上进行拼接.这样不就可以实现断点上传,又解决了http不适合上传大文件

OKhttp的封装(下)

OKhttpManager2.Class  请求工具类 1 package com.example.administrator.okhttp3; 2 3 import android.os.Handler; 4 import android.os.Looper; 5 6 import java.io.IOException; 7 import java.util.HashMap; 8 import java.util.Map; 9 10 import okhttp3.Call; 11 impor

网络请求三方库——OkHttp

我们知道在Android开发中是可以直接使用现成的API进行网络请求的,就是使用 HttpClient 和 HttpURLConnention ,而Android 4.4 之后 HttpClient 已经被废弃,由于此前一直很流行的三方库 android-async-http 是基于 HttpClient 的,所以作者已经放弃了维护 android-async-http 库,我们在项目中也尽量不要使用这个库. OkHttp是Squaur公司开源的一个高性能Http请求库,它的职责同 HttpUR

Android 使用OkHttp扩展Volley

我们先来回忆一下Volley的用法,使用Volley前,我们一般会先构造出一个RequestQueue,然后不断往该对象中添加请求Request,之后Volley便会进行调度,至于走缓存还是走网络这就看就没有请求过了.而构造RequestQueue的方法如下. Volley.newRequestQueue(mContext); 而该方法,内部实际上是调用了两个参数的重载方法 public static RequestQueue newRequestQueue(Context context) {

Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比

比较的指标: 1.cpu 2.流量 3.电量 4.内存占用 5.联网时间 功能点: 1.重试机制 2.提供的扩展功能 3.易用性 4.是否https 5.是否支持reflect api,OkHttp有配套方法 6.缓存.重试 7.cookie支持session  id会话支持 8.弱网性能和稳定性 9.超时时间,几种超时时间   连接超时,响应超时 10.适配各种机型.4.4和之前版本  2.3  4.1 5.0 4种网络连接方式提供的功能对比表格: 缓存 重试 Https/Http 稳定性 C