1OkHttp3简介:
OkHttp3是一个当前应用非常广泛的网络请求的开源框架。具有如下特点:
1)支持http2,对一台机器的所有请求共享同一个socket
2)内置连接池,支持连接复用,减少延迟
3)支持透明的gzip压缩响应体
4)通过缓存避免重复的请求
5)请求失败时自动重试主机的其他ip,自动重定向
6)好用的API
2OkHttp3基本功能:
作为一个完善的网络请求框架,Okhttp3具有如下功能:
(1) PUT,DELETE,POST,GET等请求
(2) 文件的上传下载
(3) 加载图片(内部会图片大小自动压缩)
(4) 支持请求回调,直接返回对象、对象集合
(5) 支持session的保持
3OkHttp3使用方式:
(1)添加依赖,申请权限
在build.gradle文件中,
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'com.squareup.okio:okio:1.7.0'
在清单文件中,加入权限申请:
<uses-permission android:name="android.permission.INTERNET" />
(2)使用步骤:
(1)创建OkHttpClient对象
(2)通过Builder模式创建Request对象,参数必须有个url参数,可以通过Request.Builder设置更多的参数比如:header、method等
(3)通过request的对象去构造得到一个Call对象,Call对象有execute()和cancel()等方法。
(4)以异步的方式去执行请求,调用的是call.enqueue,将call加入调度队列,任务执行完成会在Callback中得到结果。
4 OkHttp代码举例:
请求http和图片文件举例:
布局文件main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:id="@+id/hello_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:maxLength="500"
/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Used Sdk Test!"
/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Web Test!"
/>
<ImageView
android:layout_width="160dp"
android:layout_height="200dp"
android:id="@+id/imageview1"
>
</ImageView>
</LinearLayout>
说明:
(1)android:maxLength="500" :设置最大文本长度为500个字符;
(2)设置ImageView的大小为:160x200
Java文件MainMainActivity:
public class MainMainActivity extends AppCompatActivity {
private final static String TAG = "MainMainActivity";
private Context mContext;
private TextView mResTextView;
private ImageView mImageView;
private Button mButton, mBtn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
initView();
String strUrl = "https://www.baidu.com";
OkhttpRequesturl(strUrl,1);
String imgUrl = "https://www.sina.com.cn//i3.sinaimg.cn/home/2013/0331/U586P30DT20130331093840.png";
OkhttpRequesturl(imgUrl,2);
}
private void initView() {
mImageView = findViewById(R.id.imageview1);
mResTextView = findViewById(R.id.hello_textview);
}
/1. handler,用于更新UI///
private static final int Handler_Msg_Http_Str_Success = 1001;
private static final int Handler_Msg_Http_Img_Success = 1002;
private static final int Handler_Msg_Http_Fail = 1009;
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
//在Handler中更新UI
case Handler_Msg_Http_Img_Success:
byte[] imgBytes = (byte[]) msg.obj;
//创建bitmap对象
Bitmap bitmap = BitmapFactory.decodeByteArray(imgBytes, 0, imgBytes.length);
//设置图片
mImageView.setImageBitmap(bitmap);
break;
case Handler_Msg_Http_Str_Success:
String dataStr = (String)msg.obj;
Log.i(TAG, "dataStr=" + dataStr);
mResTextView.setText(dataStr);
//当加载网络失败执行的逻辑代码
case Handler_Msg_Http_Fail:
Toast.makeText(MainMainActivity.this, "网络请求失败!", Toast.LENGTH_SHORT).show();
break;
}
}
};
2. okhttp test//
public void OkhttpRequesturl(String urlstr,int type) {
Request.Builder builder = new Request.Builder();
Request request = builder.url(urlstr).method("GET",null).build();
OkhttpExecCall(request,type);
}
/**
*
* @param request
* @param type: 1:URL是普通字符串http请求;2:url是图片请求
*/
private void OkhttpExecCall(Request request, final int type) {
String str = request.toString();
Log.i(TAG, "[execCall]str=000==" + str);
OkHttpClient httpClient = new OkHttpClient();
Call call = httpClient.newCall(request);
//4.加入队列,重写回调方法
call.enqueue(new Callback() {
//失败
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
Message message = handler.obtainMessage();
message.what = Handler_Msg_Http_Fail;
handler.sendMessage(message);
}
//成功
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (type == 1) {
String dataStr = response.body().string();
Message message = handler.obtainMessage();
message.obj = dataStr;
message.what = Handler_Msg_Http_Str_Success;
message.arg1 = type;
handler.sendMessage(message);
}else if (type == 2) {
byte[] imgBytes = response.body().bytes();
Message message = handler.obtainMessage();
message.obj = imgBytes;
message.arg1 = type;
message.what = Handler_Msg_Http_Img_Success;
handler.sendMessage(message);
}
}
});
}
}
说明:
(1)Handler: 用于更新UI。Okhttp异步请求时,需要在callback中进行message的发送,将网络请求的返回数据发送到Ui线程,UI线程去更新UI;
(2)OkhttpExecCall:对OkHttpClient进行简单的封装,可以区别出是普通的http请求,还是图片请求;
(3)call.enqueue(new Callback() {...}:将请求加入到队列中,在Callback回调函数中,进行网络请求结果的处理;
(4)byte[] imgBytes = response.body().bytes();网络请求返回图片时,可以将图片信息保存在byte[]数组中。
运行结果:
在UI界面上,显示出请求返回的字符串,并且显示一张图片。