OkHttp简单介绍与使用

导读:本篇文章讲解 OkHttp简单介绍与使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、OkHttp介绍

OkHttp是一个优秀的网络请求框架,可能一说到网络请求框架,可能很多人都会想到volley,volley是一个Google提供的网络请求框架,我的博客里也有一篇专门介绍volley的博客,博客地址在此Android网络请求 —— Volley的使用 那么既然Google提供了网络请求的框架,我们为什么还要使用OkHttp呢,原来是volley是要依靠HttpCient的,而Google在Android6.0的SDK中去掉了HttpCient,所以OkHttp就开始越来越受大家的欢迎.

 

添加OkHttp的依赖:

 

在对应的Module的gradle中添加
compile 'com.squareup.okhttp3:okhttp:3.5.0'
然后同步一下项目即可

二、OkHttp进行Get请求

1 . 拿到OkHttpClient对象

 

OkHttpClient client = new OkHttpClient();

2 . 构造Request对象

 

Request request = new Request.Builder()
.get()
.url("https:www.baidu.com")
.build();

如果我们需要在get请求时传递参数,我们可以以下面的方式将参数拼接在url之后

 

https:www.baidu.com?username=admin&password=admin

3 . 将Request封装为Call

 

Call call = client.newCall(request);

4 . 根据需要调用同步或者异步请求方法

 

//同步调用,返回Response,会抛出IO异常
Response response = call.execute();

//异步调用,并设置回调函数
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(OkHttpActivity.this, "get failed", Toast.LENGTH_SHORT).show();
}

@Override
public void onResponse(Call call, final Response response) throws IOException {
final String res = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
contentTv.setText(res);
}
});
}
});

第四步有一些需要注意的地方:

  1. 同步调用会阻塞主线程,一般不适用

  2. 异步调用的回调函数是在子线程,我们不能在子线程更新UI,需要借助于runOnUiThread()方法或者Handler来处理

在AndroidManifest.xml中加入联网权限

 

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

三、OkHttp进行Post请求提交键值对

1 . 拿到OkHttpClient对象

 

OkHttpClient client = new OkHttpClient();

2 . 构建FormBody,传入参数

 

FormBody formBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "admin")
.build();

3 . 构建Request,将FormBody作为Post方法的参数传入

 

final Request request = new Request.Builder()
.url("http://www.jianshu.com/")
.post(formBody)
.build();

4 . 将Request封装为Call

 

Call call = client.newCall(request);

5 . 调用请求,重写回调方法

 

call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(OkHttpActivity.this, "Post Failed", Toast.LENGTH_SHORT).show();
}

@Override
public void onResponse(Call call, Response response) throws IOException {
final String res = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
contentTv.setText(res);
}
});
}
});

经过上面的步骤一个post请求就完成了,当然上面的url参数和需要传入的参数大家就要根据实际情况来传入,你会发现get和post请求的步骤非常像。

 

四、OkHttp进行Post请求提交字符串

如果你已经掌握了上面的两种基本的步骤,那下面的内容就比较简单了

 

上面我们的post的参数是通过构造一个FormBody通过键值对的方式来添加进去的,其实post方法需要传入的是一个RequestBody对象,FormBodyRequestBody的子类,但有时候我们常常会遇到要传入一个字符串的需求,比如客户端给服务器发送一个json字符串,那这种时候就需要用到另一种方式来构造一个RequestBody如下所示:

 

 

RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"), "{username:admin;password:admin}");

上面的MediaType我们指定传输的是纯文本,而且编码方式是utf-8,通过上面的方式我们就可以向服务端发送json字符串啦。

 

五、OkHttp进行Post请求上传文件

理解了上面一个,下面这个就更简单了,这里我们以上传一张图片为例,当然你也可以上传一个txt什么的文件,都是可以的

其实最主要的还是构架我们自己的RequestBody,如下图构建

 

File file = new File(Environment.getExternalStorageDirectory(), "1.png");
if (!file.exists()){
Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
}else{
RequestBody requestBody2 = RequestBody.create(MediaType.parse("application/octet-stream"), file);
}

这里我们将手机SD卡根目录下的1.png图片进行上传。代码中的application/octet-stream表示我们的文件是任意二进制数据流,当然你也可以换成更具体的image/png

注:最后记得最重要的一点:添加存储卡写权限,在AndroidManifest.xml文件中添加如下代码:

 

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

六、OkHttp进行get请求下载文件

除了上面的功能,我们最常用的功能该有从网路上下载文件,我们下面的例子将演示下载一个文件存放在存储卡根目录,从网络下载一张图片并显示到ImageView中

1 . 从网络下载一个文件(此处我们以下载一张图片为例)

 

public void downloadImg(View view){
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder()
.get()
.url("https://www.baidu.com/img/bd_logo1.png")
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("moer", "onFailure: ");;
}

@Override
public void onResponse(Call call, Response response) throws IOException {
//拿到字节流
InputStream is = response.body().byteStream();

int len = 0;
File file = new File(Environment.getExternalStorageDirectory(), "n.png");
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[128];

while ((len = is.read(buf)) != -1){
fos.write(buf, 0, len);
}

fos.flush();
//关闭流
fos.close();
is.close();
}
});
}

你会发现步骤与进行一般的Get请求差别不大,唯一的区别在于我们在回调函数中所做的事,我们拿到了图片的字节流,然后保存为了本地的一张图片

 

2 . 从网络下载一张图片并设置到ImageView中

其实学会了上面的步骤你完全可以将图片下载到本地后再设置到ImageView中,当然下面是另一种方法
这里我们使用BitmapFactorydecodeStream将图片的输入流直接转换为Bitmap,然后设置到ImageView中,下面只给出onResponse()中的代码.

 

 

@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream is = response.body().byteStream();

final Bitmap bitmap = BitmapFactory.decodeStream(is);
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});

is.close();
}

分享一些OkHttp常用的总结,希望可以帮助到需要的人

OkHttp 官方中文文档地址:

http://www.360doc.com/content/17/1130/09/47897177_708522830.shtml

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/119224.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!