浅谈OKHttp封装

最近在学OKHttp,看了一些文章,自己也学着对其做了一点封装。

首先,需要了解OKHttp的网络请求过程:


先初始化OkHttpClient对象,接着设置读取、连接的超时时间等配置。在这里配置如下:

mOkHttpClient = new OkHttpClient();
mOkHttpClient.newBuilder()
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cookieJar(mOkHttpClient.cookieJar())
        .cache(new Cache(cacheDirectory, cacheSize))
        .build();
cacheDirectory是文件目录,cacheSize是缓存目录的大小


1).对于get方式的请求:

利用请求的url构造request对象

Request request = new Request.Builder().url(url).build();

接下来如果采用异步的get方式请求,就是:

mOkHttpClient.newCall(request).enqueue(new Callback() {

    @Override
    public void onFailure(Call call, IOException e) {
        //失败的回调
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
	String str = response.body().string();
} }});
在这里通过response.body()可以获取字符串、字节数组、流等数据格式。如果返回json格式的字符串,就可以在这里利用各种json的解析库进行解析;流的话就可以进行文件的下载,后面有具体的封装。

如果是采用同步的get方式请求,就是:

mOkHttpClient.newCall(request).execute(); 这里返回Response对象,这个方式会阻塞线程


2).对于post方式的请求:

我们都知道,对于post方式的请求,其请求的参数是放在请求体当中,因此,需要先构造请求体,然后利用请求体来构造Request对象

private Request buildPostRequest(String url, List<Param> params) {
    FormBody.Builder builder = new FormBody.Builder();
    for (Param param : params) {
        builder.add(param.key, param.value);
    }
    RequestBody requestBody = builder.build();
    return new Request.Builder().url(url).post(requestBody).build();
}

然后接下来的步骤和get就是一样的。post方式也有同步的方法,和get的同步一样


如果是下载文件的话,就需要先通过response.body().byteStream()方式获取字节流,然后将字节流写入sd卡中,具体封装如下:

public File saveFile(final ResultCallback callback, Response response) throws IOException {
    InputStream is = null;
    byte[] buf = new byte[2048];
    int len = 0;
    FileOutputStream fos = null;
    try {
        is = response.body().byteStream();
        final long total = response.body().contentLength();
        long sum = 0;

        File dir = new File(destFileDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        final File file = new File(dir, getPhotoFileName());
        fos = new FileOutputStream(file);
        while ((len = is.read(buf)) != -1) {
            sum += len;
            fos.write(buf, 0, len);
            final long finalSum = sum;
            mDelivery.post(new Runnable() {
                @Override
                public void run() {
                    if (callback != null) {
                        if (finalSum * 1.0f / total != 1.0) {
                            callback.onProgress(finalSum * 1.0f / total, total);
                        } else {
                            callback.onSuccess(file);
                        }
                    }
                }
            });
            if (finalSum * 1.0f / total == 1.0) {
                break;
            }
        }
        fos.flush();
        return file;

    } finally {
        try {
            if (is != null) is.close();
        } catch (IOException e) {
        }
        try {
            if (fos != null) fos.close();
        } catch (IOException e) {
        }

    }
}
ResultCallback 类是一个抽象类,封装了请求成功与失败,以及下载文件的进度的方法。mDelivery是主线程的Handler对象,用于更新UI。


以上对关键部分作出了解释,最后还是附上完整的封装的代码吧(只封装了get和post以及文件下载和上传(上传没有测试)的方法,其他的请求方式如:put等请求就没有封装了,如果有需求,可以参见:http://blog.csdn.net/lmj623565791/article/details/49734867)


对于使用OKHttp作为网络请求的框架,想到了可以将Fresco加载图片的框架改成OKHttp作为网络请求框架,因为Fresco如果没有配置的话,默认使用的是HttpURLConnection作为网络请求层,改成OKHttp也很简单,代码如下:

当然,首先需要引入相关的包

dependencies {
  // your project's other dependencies
  compile "com.facebook.fresco:fresco:0.9.0+"
  compile 'com.facebook.fresco:imagepipeline-okhttp:0.9.0+'
}
private void initFresco(){
    OkHttpClient mOkHttpClient = new OkHttpClient();
    Set<RequestListener> listeners = new HashSet<>();
    listeners.add(new RequestLoggingListener());
    ImagePipelineConfig config = OkHttpImagePipelineConfigFactory
            .newBuilder(this, mOkHttpClient)
            .setDownsampleEnabled(true)
            .setRequestListeners(listeners)
            .build();
    Fresco.initialize(this, config);
}
注意,现在OKHttpClient对象不是okhttp3下面的,而是com.squareup.okhttp包下面的。


以上是我学习okhttp的一些总结,有些不对的地方希望大神们指教啊。

最后将封装的工具类和例子都上传至我的github,欢迎download


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OkHttp是一个开源的HTTP客户端库,它封装了平台之间的差异性,为我们提供了方便的接口来发送HTTP请求和处理响应。当我们使用OkHttp时,可以使用封装类来简化使用过程。 OkHttp封装类主要包括以下几个方面: 1. 初始化OkHttpClient:首先,我们需要创建一个OkHttpClient对象,用于发送HTTP请求。在封装类中,可以在构造方法中进行OkHttpClient的初始化设置,比如设置超时时间、添加拦截器等。 2. 发送GET请求:通过封装类,我们可以定义一个方法来发送GET请求。该方法接收一个URL作为参数,使用OkHttpClient来创建一个Request对象,并通过该对象发送异步的GET请求。在回调中处理服务器响应结果,并返回给调用者。 3. 发送POST请求:类似于GET请求,我们可以封装一个方法来发送POST请求。该方法接收一个URL和需要发送的数据作为参数,使用OkHttpClient创建一个RequestBody对象,并通过该对象发送异步的POST请求。同样,在回调中处理响应结果,并返回给调用者。 4. 添加请求头:在某些情况下,我们可能需要添加请求头来发送自定义的信息。封装类可以提供一个方法,接收一个字符串类型的键值对参数,用于添加自定义的请求头。 5. 异步请求:OkHttp的请求是异步执行的,默认情况下在子线程中发送请求并在主线程中处理结果。封装类可以将异步请求的结果通过回调的方式返回给调用者,方便处理响应结果。 通过封装类,我们可以将OkHttp的使用变得更简单、更便捷。可以将一些通用的处理逻辑提取出来,在封装类中进行统一处理,并对外提供更友好的接口。这样可以减少代码的重复性,提高开发效率。同时,封装类还可以对请求进行统一的异常处理、日志打印等操作,方便排查问题和调试。总之,OkHttp封装类可以让我们更好地利用OkHttp的强大功能,提升开发效率和代码可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值