OkHttp3 如何使用

太久没有写过东西了。这几年没有总结浪费时间,回到正题。

OkHttp 一款网络请求库或者说一个漂亮的网络请求第三方请求库。这里面说的都是OkHttp3 ,因为今天OkHttp2已经是过去了。就想我开始做Android的时候是基于2.2开发一样,老的不能在老了一样,会被人慢慢遗忘。

引用OkHttp3 步骤简单 

Android Studio 配置gradle:

  compile 'com.squareup.okhttp3:okhttp:3.2.0'
  compile 'com.squareup.okio:okio:1.7.0'

别忘记Android的网络权限,这个东西十分讨厌很容易忘记,然后在测试的时候一看错误就是一拍大腿,我去 这个我也能忘 哈哈 毕竟开发一款APP就只写一次。不过现在应该好了6.0的系统让我们不在可能忘记了。动态权限来了~ 又扯远了

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

读写权限也添加上去,网络请求有时候需要缓存GET请求数据。

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

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

OkHttpClient是我们使用OkHttp3的初始化对象,看这个字面的意思很好理解。一个客户端,一个连接服务器的客户端。第一个反应就是他不用每次都创建他。那么一个APP可以维护一个这样的对象就可以了。这样的对象我们可以单例使用。如下:

public class OkHttpEngine {
    private static OkHttpEngine mInstance;
    private OkHttpClient mOkHttpClient;
    private Handler mHandler;
    public static OkHttpEngine getInstance() {
        if (mInstance == null) {
            synchronized (OkHttpEngine.class) {
                if (mInstance == null) {
                    mInstance = new OkHttpEngine();
                }
            }
        }
        return mInstance;
    }
    private OkHttpEngine() {
        mOkHttpClient = new OkHttpClient();
	//下面的设置是连接时间和读写时间
        mOkHttpClient.setConnectTimeout(15, TimeUnit.SECONDS);
        mOkHttpClient.setWriteTimeout(20, TimeUnit.SECONDS);
        mOkHttpClient.setReadTimeout(20, TimeUnit.SECONDS);
        mHandler = new Handler();
    }
    //设置网络请求数据缓存位置和大小,缓存的数据一般都是GET类型的请求,这种类型数据改变的情况比较小
    public OkHttpEngine setCache(Context mContext) {
        File sdcache = mContext.getExternalCacheDir();
        int cacheSize = 10 * 1024 * 1024;
        mOkHttpClient.setCache(new Cache(sdcache.getAbsoluteFile(), cacheSize));
        return mInstance;
    }

}



好了初始化,完成我们来GET请求实例

无论请求类型是什么,OkHttp3都是通过Request.Builder来创建一Request的。这里有一点默认请求就是GET类型所以不需要设置

Request.Builder requestBuilder = new Request.Builder().url("http://www.baidu.com");
//下面的这句在GET请求的使用就变得可有可无了
requestBuilder.method("GET",null);
Request request = requestBuilder.build();

创建一个请求回调对象

Call mcall= mOkHttpClient.newCall(request);

开始执行请求

 
 
call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                //请求失败回调
            }
            @Override
            public void onResponse(final Response response) throws IOException {
                //请求成功回调,回调并不是在UI线程,这一点有好处也有坏处。毕竟大多数的数据都是直接就可以使用的
            }
});

因为GET请求的数据有可能是缓存数据在onResponse回调里面是通过

if(null == response.cacheResponse())
来判断缓存是否有数据的。

同时在请求的时候我们也可以通过配置来控制是否使用缓存数据的时间,也就是缓存数据的生命周期时间。OkHttp3提供了几种可能

请求的时候设置保存数据多久,cache_maxAge_inseconds 缓存最大生存时间,单位为秒,这样的请求会自动将数据缓存起来,如果数据超过缓存最大时间则删除数据

Request.Builder requestBuilder = new Request.Builder().cacheControl(new CacheControl.Builder().maxAge(cache_maxAge_inseconds, TimeUnit.SECONDS).build()).url("http://www.baidu.com");

请求时候设置过时时间staletime 过时时间,秒为单位

Request.Builder requestBuilder = new Request.Builder().cacheControl(new CacheControl.Builder().maxStale(staletime, TimeUnit.SECONDS).build()).url("http://www.baidu.com");

这里说明下StaleTime与maxAge的区别。

StaleTime:指的是过时时间,设置它后,会将数据缓存,如果没有超过过时时间,说明数据还是新的,或直接拿缓存数据返回,如果超过是过时时间,那么我们认为数据过时了,它会去或者网络数据进行更新并返回,注意,它是不会删除缓存的。

maxAge:限制了缓存的生存时间,超过了就会删除该请求的缓存。

POST请求,这是一个带参数和图片的post请求
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("title", "wangshu")
            .addFormDataPart("image", "wangshu.jpg",
                    RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/test.jpg")))
            .build();

    Request request = new Request.Builder()
            .header("Authorization", "Client-ID " + "...")
            .url("https://api.imgur.com/3/image")
            .post(requestBody)
            .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.i("tianzhw", response.body().string());
       }
   });
POST上传一个文件
public static final MediaType MEDIA_TYPE_MARKDOWN
            = MediaType.parse("text/x-markdown; charset=utf-8");

mOkHttpClient=new OkHttpClient();
        File file = new File("/sdcard/wangshu.txt");
        Request request = new Request.Builder()
                .url("https://api.github.com/markdown/raw")
                .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
                .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.i("tianzhw",response.body().string());
                }
            });

下载一个文件
mOkHttpClient = new OkHttpClient();
        String url = "http://xxx/test.jpg";
        Request request = new Request.Builder().url(url).build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) {
                InputStream inputStream = response.body().byteStream();
                FileOutputStream fileOutputStream = null;
                try {
                    fileOutputStream = new FileOutputStream(new File("/sdcard/tianzhw.jpg"));
                    byte[] buffer = new byte[2048];
                    int len = 0;
                    while ((len = inputStream.read(buffer)) != -1) {
                        fileOutputStream.write(buffer, 0, len);
                    }
                    fileOutputStream.flush();
                } catch (IOException e) {
                    Log.i("wangshu", "IOException");
                    e.printStackTrace();
               }

               Log.d("wangshu", "文件下载成功");
           }
       });
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值