当前位置:   article > 正文

Android开发-网络请求框架okhttp3的使用_android okhttp3

android okhttp3

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文件中,

  1. implementation 'com.squareup.okhttp3:okhttp:3.4.1'
  2. 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:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. >
  8. <TextView
  9. android:id="@+id/hello_textview"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:text="Hello World!"
  13. android:maxLength="500"
  14. />
  15. <Button
  16. android:id="@+id/button1"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:text="Used Sdk Test!"
  20. />
  21. <Button
  22. android:id="@+id/button2"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:text="Web Test!"
  26. />
  27. <ImageView
  28. android:layout_width="160dp"
  29. android:layout_height="200dp"
  30. android:id="@+id/imageview1"
  31. >
  32. </ImageView>
  33. </LinearLayout>

说明:

(1)android:maxLength="500" :设置最大文本长度为500个字符;

(2)设置ImageView的大小为:160x200 

Java文件MainMainActivity:

  1. public class MainMainActivity extends AppCompatActivity {
  2. private final static String TAG = "MainMainActivity";
  3. private Context mContext;
  4. private TextView mResTextView;
  5. private ImageView mImageView;
  6. private Button mButton, mBtn2;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. mContext = this;
  12. initView();
  13. String strUrl = "https://www.baidu.com";
  14. OkhttpRequesturl(strUrl,1);
  15. String imgUrl = "https://www.sina.com.cn//i3.sinaimg.cn/home/2013/0331/U586P30DT20130331093840.png";
  16. OkhttpRequesturl(imgUrl,2);
  17. }
  18. private void initView() {
  19. mImageView = findViewById(R.id.imageview1);
  20. mResTextView = findViewById(R.id.hello_textview);
  21. }
  22. /1. handler,用于更新UI///
  23. private static final int Handler_Msg_Http_Str_Success = 1001;
  24. private static final int Handler_Msg_Http_Img_Success = 1002;
  25. private static final int Handler_Msg_Http_Fail = 1009;
  26. Handler handler = new Handler(){
  27. @Override
  28. public void handleMessage(Message msg) {
  29. switch (msg.what){
  30. //在Handler中更新UI
  31. case Handler_Msg_Http_Img_Success:
  32. byte[] imgBytes = (byte[]) msg.obj;
  33. //创建bitmap对象
  34. Bitmap bitmap = BitmapFactory.decodeByteArray(imgBytes, 0, imgBytes.length);
  35. //设置图片
  36. mImageView.setImageBitmap(bitmap);
  37. break;
  38. case Handler_Msg_Http_Str_Success:
  39. String dataStr = (String)msg.obj;
  40. Log.i(TAG, "dataStr=" + dataStr);
  41. mResTextView.setText(dataStr);
  42. //当加载网络失败执行的逻辑代码
  43. case Handler_Msg_Http_Fail:
  44. Toast.makeText(MainMainActivity.this, "网络请求失败!", Toast.LENGTH_SHORT).show();
  45. break;
  46. }
  47. }
  48. };
  49. 2. okhttp test//
  50. public void OkhttpRequesturl(String urlstr,int type) {
  51. Request.Builder builder = new Request.Builder();
  52. Request request = builder.url(urlstr).method("GET",null).build();
  53. OkhttpExecCall(request,type);
  54. }
  55. /**
  56. *
  57. * @param request
  58. * @param type: 1:URL是普通字符串http请求;2:url是图片请求
  59. */
  60. private void OkhttpExecCall(Request request, final int type) {
  61. String str = request.toString();
  62. Log.i(TAG, "[execCall]str=000==" + str);
  63. OkHttpClient httpClient = new OkHttpClient();
  64. Call call = httpClient.newCall(request);
  65. //4.加入队列,重写回调方法
  66. call.enqueue(new Callback() {
  67. //失败
  68. @Override
  69. public void onFailure(Call call, IOException e) {
  70. e.printStackTrace();
  71. Message message = handler.obtainMessage();
  72. message.what = Handler_Msg_Http_Fail;
  73. handler.sendMessage(message);
  74. }
  75. //成功
  76. @Override
  77. public void onResponse(Call call, final Response response) throws IOException {
  78. if (type == 1) {
  79. String dataStr = response.body().string();
  80. Message message = handler.obtainMessage();
  81. message.obj = dataStr;
  82. message.what = Handler_Msg_Http_Str_Success;
  83. message.arg1 = type;
  84. handler.sendMessage(message);
  85. }else if (type == 2) {
  86. byte[] imgBytes = response.body().bytes();
  87. Message message = handler.obtainMessage();
  88. message.obj = imgBytes;
  89. message.arg1 = type;
  90. message.what = Handler_Msg_Http_Img_Success;
  91. handler.sendMessage(message);
  92. }
  93. }
  94. });
  95. }
  96. }

 说明:

(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界面上,显示出请求返回的字符串,并且显示一张图片。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45667?site
推荐阅读
相关标签
  

闽ICP备14008679号