赞
踩
OkHttp3是一个当前应用非常广泛的网络请求的开源框架。具有如下特点:
1)支持http2,对一台机器的所有请求共享同一个socket
2)内置连接池,支持连接复用,减少延迟
3)支持透明的gzip压缩响应体
4)通过缓存避免重复的请求
5)请求失败时自动重试主机的其他ip,自动重定向
6)好用的API
作为一个完善的网络请求框架,Okhttp3具有如下功能:
(1) PUT,DELETE,POST,GET等请求
(2) 文件的上传下载
(3) 加载图片(内部会图片大小自动压缩)
(4) 支持请求回调,直接返回对象、对象集合
(5) 支持session的保持
(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中得到结果。
请求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界面上,显示出请求返回的字符串,并且显示一张图片。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。