初探Okhttp网络框架使用(一)

无论使用什么网络框架,我们的目的都是用其去快速的请求和获取数据,那么,根据数据类型来区分的话,我们应该平时需要那些数据呢?

1.字符流(字符串)
2.字节流(图片和视频等)
3.对象流(很少使用到,自己去查资料) 常用的就字符和字节流两种,那么,使用OkHttp网络框架有什么好用之处呢?

看官方说明比较权威一些 :http://square.github.io/okhttp/#overview
GitHub开源代码 :https://github.com/square/okhttp
这里也说明一下:

1.封装复杂的请求和响应流程
2.使用了连接池技术,减少请求和响应延迟时间
3.简单的数据请求之外,还支持文件下载与上传
4.使用了响应缓存,避免了请求数据时重复请求
5.使用了线程队列,请求过程中如果遇到突发问题可以从队列中取消请求

前期我们先配置引入jar包,老规矩(有字有图有真相):
okhttp是依赖于okio包存在的,所以必须引入两个包
compile’com.squareup.okhttp3:okhttp:3.4.2’
compile’com.squareup.okio:okio:1.11.0’
这里我还导入了一个好用的图片操作jar包
compile’com.github.bumptech.glide:glide:3.7.0’
这里写图片描述

这里写图片描述
完成了前期的包导入,那么,接下来我们直接进入主题 , 先定个小目标,比方说 : 发几个Get方式请求数据…

//初始化请求客户端
OkHttpClient okHttpClient= newOkHttpClient();
new Thread(new Runnable() {
@Override
public void run() {
try{
       //发一个简单的Get方式请求,必须得在子线程中执行
        sendGetRequest(requestUrl);
}catch (IOException e) {
    e.printStackTrace();
  }
}
}).start();
/**
*发一个简单的get请求,必须得在子线程中执行,如果要把数据更新到界面,得放在主线程中去更新
*
*@param url
*@throwsIOException
*/
private void sendGetRequest(String url) throws IOException {
//创建一个Request请求对象,对象为链式调用
Request request =new Request.Builder().url(url).build();
//用okHttpClient通过Get方式请求
Response response =okHttpClient.newCall(request).execute();
final String string = response.body().string();
if(response.isSuccessful()) {//响应成功 200
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
        content.setText(string);
        Toast.makeText(MainActivity.this,"数据请求成功", Toast.LENGTH_SHORT).show();
    }
});
}else {
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        content.setText(string);
        Toast.makeText(MainActivity.this,"数据请求失败", Toast.LENGTH_SHORT).show();
                    }
        });
    }
}

/**
*异步Get请求字符串
*
*@paramurl
*@throwsIOException
*/
private void sendAsyncRequestString(String url)throws IOException {
Request request =new Request.Builder().url(url).build();
//发一个异步请求
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(final Call call, IOException e) {
    Log.e(TAG,"数据请求失败");
}

@Override
public void onResponse(Call call, final Response response) throwsIOException {
    final String data = response.body().string();
if(response.isSuccessful()) {//响应成功
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(MainActivity.this,"数据请求成功", Toast.LENGTH_SHORT).show();
        content.setText(data);
    }
    });
}else {
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
            Toast.makeText(MainActivity.this,"数据请求失败", Toast.LENGTH_SHORT).show();
            content.setText(data);
        }
        });
        }
    }
});
}

OkHppt如果不是异步请求,就必须在子线程中调用,得到数据后要更新到UI上就必须到发到主线程中去更新,否则会抛出非主线程异常(连Toast也必须在主线程中),早期版本获取字符串是response.body().toString(),版本okhttp:3.4.2后获取字符串改为response.body().string()才能获取到字符串数据.

那么接下来我们发一个Post请求和获取一张图片:

/**
*发一个Post请求,携带键值对数据
*@paramurl
*/
private void sendPostRequest(String url) {
//构建一个请求体,通过add键值对添加数据,也是链式调用
RequestBody body =new FormBody.Builder()
.add("name","我是数据name")
.add("password","我是数据password")
.build();
//构建完请求参数后,通过post传入body后发送Post请求数据
Request request =new Request.Builder().url(url).post(body).build();
//发一个异步请求
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(final Call call, IOException e) {
    Log.e(TAG,"数据请求失败");
}

@Override
public void onResponse(Call call, final Response response) throwsIOException {
final String data = response.body().string();
if(response.isSuccessful()) {//响应成功
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
            Toast.makeText(MainActivity.this,"数据请求成功", Toast.LENGTH_SHORT).show();
        content.setText(data);
    }
});
}else {
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
            Toast.makeText(MainActivity.this,"数据请求失败", Toast.LENGTH_SHORT).show();
            content.setText(data);
                      }
                });
            }
        }
    });
}

/**
*请求一张图片
*@paramurl
*/
private void sendPhotoRequest(String url) {
    Request request =new Request.Builder().url(url).build();
    okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(final Call call, IOException e) {
        Log.e(TAG,"数据请求失败");
    }

    @Override
    public void onResponse(Call call, final Response response) throwsIOException {
    //通过response.body()可以获取字符流,字节流数据
    //请求的是图片,获取字节流数据
    final byte[] bytes = response.body().bytes();
    if(response.isSuccessful()) {
        runOnUiThread(new Runnable() {
        @Override
        public void run() {
                Toast.makeText(MainActivity.this,"数据请求成功", Toast.LENGTH_SHORT).show();
        //使用Glide图片框架设置到ImageView中
        Glide.with(MainActivity.this).load(bytes).into(showBitmapImageView);
            }
        });
    }else {
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(MainActivity.this,"数据请求失败", Toast.LENGTH_SHORT).show();
        Glide.with(MainActivity.this).load(R.mipmap.ic_launcher).into(showBitmapImageView);
                    }
                });
            }
        }
    });
    }

使用OkHttp发送的请求大多类似,只是在发Get的时候没有请求体,直接就通过响应成功后获取数据,然而Post只多了一个RequestBody请求体,FormBody继承了RequestBody而再次封装了而已,之前的版本是通过FormEncodingBuilder来封装请求数据,版本okhttp:3.4.2后使用FormBody,在请求一张图片时,响应成功后,直接可以通过字节流response.body().bytes()来获取,,然而里面也可以获取字符流和字节流数据,很方便我们去使用.OkHttp还有其他方式的Post请求携带参数,同时OkHttp还支持文件上传和下载,响应缓存,请求队列的取消与恢复等等….初探OkHttp网络框架到此,后续继续探索….

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值