网络数据读取框架 - OkHttp的使用

OkHttp框架介绍与用法

  • 作用
    OkHttp主要用于对String这类的数据进行网络读取的操作,文件的上传,但在图片的缓存处理上不够好,需要手动设置缓存区

  • 使用【以Android Studio为例】

一、添加OkHttp框架
Android Studio中File→Project Structure→找到对应的Module项目→Denpendencies→点击加号→Library Dependency→输入你所需要的框架名称,这里需要添加两个框架:

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

二、创建一个OkHttpClient对象,后期需要通过该对象发出网络请求【两种方式】
1、无缓存创建方式

private OkHttpClient client = new OkHttpClient();

2、有缓存创建方式

private OkHttpClient client;
//如果需要手动设置或修改缓存处理,即超时处理,使用以下方式:通过builder对象设置缓存及超时的处理
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//设置连接超时,当前为10小时
builder.connectTimeout(10, TimeUnit.HOURS);
//设置读取时间超时
builder.readTimeout(10, TimeUnit.HOURS);
//设置写入数据,上传数据超时时间
builder.writeTimeout(10, TimeUnit.HOURS);
//设置缓存信息的处理:创建缓存对象,构造方法用于控制缓存位置及最大缓存大小【单位是Byte】
Cache cache = new Cache(new File("/mnt/sdcard/usher"), 10 * 1024 * 1024);
builder.cache(cache);
//通过builder对象初始化OkHttp对象
client = builder.build();

三、网络数据的处理方式【整理了四种】
1、GET请求方式1


    *步骤
    * 1、封装Request对象,用于设置请求的网址与请求的条件
    * 2、通过初始化好的Builder对象设置一些网络请求信息【url用于设置连接的网址】
    * 3、通过Builder设置好相关信息后,只需要通过build方法即可得到对应的Request对象
    * */
        String url = "http://bz.budejie.com/?typeid=2&ver=3.4.3&no_cry=1&client=android&c=wallPaper&a=category";
        Request request = new Request.Builder().url(url).build();
        Call call = client.newCall(request);//获取本次请求任务的Call对象
        //执行请求
        call.enqueue(new Callback() {
            @Override//请求发送失败调用的方法
            public void onFailure(Call call, IOException e) {
                Log.i("==", "onFailure: 数据获取失败");
            }

            @Override//请求发送成功调用的方法:该方法运行在子线程中,如果想通过结果更新页面需要通过Hanlder将结果传入主线程
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string();
                Log.i("==", "本次请求的结果为:" + result);
                Log.i("==", "onResponse 方法:" + Thread.currentThread().getName());
                Log.i("==", "缓存的位置  " + client.cache().directory().getAbsolutePath());
                Log.i("==", "缓存的已用大小  " + client.cache().size());
                Log.i("==", "缓存的最大大小  " + client.cache().maxSize());
                //请在onCreate方法中自己建立Handler对象
                Message message = Message.obtain();
                message.what = 1;
                message.obj = result;
                handler.sendMessage(message);
            }
        });

2、GET请求方式2


final Call call = client.newCall(
                new Request.Builder()
                        .url("http://bz.budejie.com/?typeid=2&ver=3.4.3&no_cry=1&client=android&c=wallPaper&a=category")
                        .build()
        );
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Response response = call.execute();
                    Log.i("==", "run: " + response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

3、POST请求方式

        //通过RequestBody的create方法进行请求条件的封装
        RequestBody body = RequestBody.create(
                //参数1:数据类型
                MediaType.parse("application/json; charset=utf-8"),
                //参数2:请求条件
                "platform=2&gifttype=1&compare=60841c5b7c69a1bbb3f06536ed685a48"
        );
        //封装请求对象
        final Request request = new Request.Builder()
                .url("http://zhushou.72g.com/app/gift/gift_list/")
                .post(body)
                .build();

        final Call call = client.newCall(request);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Response response = call.execute();
                    Log.i("==", "run: " + response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

4、文件的上传

File file = new File("/storage/emulated/0/DCIM/Screenshots/iPhone.png");//创建文件对象
        RequestBody body = RequestBody.create(
                MediaType.parse("text/x-markdown; charset=utf-8"),
                file
        );
        final Call call = client.newCall(new Request.Builder()
                .url("https://api.github.com/markdown/raw")
                .post(body)
                .build()
        );
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Response response = call.execute();
                    Log.i("", "run: " + response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

四、取消OkHttp网络访问

//只要把某个请求对象的Call对象调用cancel()方法即可
call.cancel();

总结:OkHttp主要多用于文字类型数据的处理,但因为其需要手动设置缓存,因此在获取图片等类型的数据上优势不大。

PS:这是我第一次使用Markdown写文章,挺舒服好用,强烈推荐各位做文案或产品以及各位程序员同胞使用

另:欢迎关注我的B站频道:Lollipop丶Guy的B站频道
内容:科技+音乐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值