OKHttp

文章目录

  • OKHttp
    • 一、简介
    • 二、基本用法
      • 1、依赖
      • 2、使用OKHttp
        • 2.1、get请求
        • 2.2、post请求
      • 3、案例操作演示(借助runOnUiThread()方法进行线程切换)
      • 4、使用回调方法请求网络
      • 5、案例操作演示(通过Handler对象传递消息给主线程。)

一、简介

​ OKHttp是一款优秀的HTTP框架,他支持get请求和get请求,支持基于http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。

​ OKHttp不仅在接口封装上面做的简单易用,就连在底层实现上也是自成一派,比起原生的HttpURLConnection,可以上市有过而过之不及,现在就是成为广大Android开发者首选的网络通信库。

​ OKHttp的项目主页地址时:https://github.com/square/okhttp

注意:OkHttp有2.0版本和3.0的版本,目前常用的是OkHttp3。

二、基本用法

1、依赖

在使用之前先添加OKHttp库的依赖,编辑app/build.gradle文件在dependencies闭包中添加如下内容:

implementation 'com.squareup.okhttp3:okhttp:4.4.0'

也可以通过工具,在项目中添加OKHttp库的依赖

2、使用OKHttp

2.1、get请求

步骤一:创建OKHttpClient类的实例

OkHttpClient  client = new OkHttpClient();

步骤二:创建Request对象(并设置目标地址、请求方式等)

//需要在build()方法前连缀其他方法来丰富这个Request对象
Request request = new Request.Builder().url(“https://www.baidu.com”)   //设置目标网络地址.get()    //默认为GET请求,可以省略  .build();

步骤三:调用newCall()方法创建call对象

Call  call = client.newCall(request);

步骤四:发送请求并获取服务器返回的数据(同步、异步)

同步请求:

执行请求的操作是阻塞式,直到HTTP响应返回。如果当前OkHttpClient已经执行了一个同步任务,如果这个任务没有释放锁,那么新发起的请求将被阻塞,直到当前任务释放锁。同步请求对应OkHttp中的execute()方法。

//因为同步请求的方式会阻塞调用线程,所以提交同步请求的操作应放在子线程中执行,否则有可能会引起ANR异常,并且在Android 3.0以后已经不允许在主线程中进行网络操作了。new Thread(new Runnable() {public void run() {try {Response response = call.execute();String  responseData = response.body().string();Log.d(TAG, "run: " + responseData);} catch (IOException e) {e.printStackTrace();}}
}).start();

异步请求:

执行的是非阻塞式请求,它的执行结果一般都是通过接口回调的方式告知调用者。同一时刻可以发起多个请求,因为异步请求每一个都是在一个独立的线程,由线程队列管理。异步请求对应OkHttp中的enqueue()方法。

//通过Call对象的enqueue(Callback)方法来提交异步请求,异步发起的请求会被加入到队列中通过线程池来执行。最后通过接口回调的onResponse()方法来接收服务器返回的数据。
call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.d(TAG, "onFailure: ");}@Overridepublic void onResponse(Call call, Response response) throws IOException {String  responseData = response.body().string();Log.d(TAG, "onResponse: " + responseData);}
});

2.2、post请求

步骤一:创建OKHttpClient类的实例

OkHttpClient  client = new OkHttpClient();

步骤二:创建Request对象

​ 如果是发起一条POST请求会比GET请求稍微复杂一点,在构建Request对象时,需要多构造一个RequestBody对象,用它来携带我们要提交的数据。
​ 在构造RequestBody时需要指定MediaType,用于描述请求/响应body的内容类型。RequestBody的几种常用构造方式如下:

create(   String  content, MediaType  contentType)    //提交String类型数据
create(   byte[]  content ,MediaType  contentType)    //提交byte[]类型数据
create(   File    file ,   MediaType  contentType)           //提交File类型数据

使用FormBody提交表单,同时在FormBody中添加多个String键值对,最后为Request添加post方法并传入FormBody。

RequestBody  requestBody = new FormBody.Builder().add(“username”,”admin”).add(“password”,”123456”).build();Request  request = new Request.Builder().url(“https://www.baidu.com”).post(requestBody).build();

后面一样,略。

3、案例操作演示(借助runOnUiThread()方法进行线程切换)

加入依赖

xml文件

activity文件

添加访问网络请求

4、使用回调方法请求网络

HttpUtil类:

public class HttpUtil{public static void sendOkHttpRequest(String address,okhttp3.Callback callback){OkHttpClient  client = new  OkHttpClient();Request  request  = new  Request.Builder().url(address).build();client.newCall(request).enqueue(callback);}
}

Okhttp3.Callback

因为OkHttp库中自带了一个回调接口Callback,类似于前面编写的HttpCallbackListener。
通过调用enqueue()方法,其内部不仅开好了子线程,同时还会在子线程中去执行HTTP请求,最后将请求的结果回调到Callback接口中。

OKHttp封装:调用HttpUtil类中的sendOkHttpRequest()方法

HttpUtil.sendOkHttpRequest(“https://www.baidu.com”,new okhttp3.Callback(){@Overridepublic void onResponse(Call call,Response response) throws IOException {//得到服务器返回的具体内容String  responseData = response.body().string();}@Overridepublic void onFailure(Call call,IOException e){//对异常情况进行处理}
});

注意:

不管是HttpURLConnection还是OkHttp,最终的回调接口都还是在子线程中进行的,因此不可以在回调接口中执行任何的UI操作。

方法1:借助runOnUiThread()方法进行线程切换。

runOnUiThread(new Runnable() {@Overridepublic void run() {......}
});

方法2:通过Handler对象传递消息给主线程。

private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {Object obj = msg.obj;ivPic.setImageBitmap((Bitmap) obj);}
};Message message = new Message();
message.obj = bitmap;
handler.sendMessage(message);

5、案例操作演示(通过Handler对象传递消息给主线程。)

通过网络图片的地址获取图片

xml页面:里面一个ImageView控件,这里略

回调接口:okhttp3.Callback(OKHttp自带的回调接口)

工具类:HttpUtil02

public class HttpUtil02 {public static  void sendOkHttpRequest(final String address,okhttp3.Callback callback){OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().url(address).get().build();Call call = okHttpClient.newCall(request);call.enqueue(callback);}
}

activity:

public class OKHttpActivity04 extends AppCompatActivity {private EditText et_path;private ImageView ivPic;private Bitmap bitmap;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {Object obj = msg.obj;ivPic.setImageBitmap((Bitmap) obj);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_1_1);et_path = findViewById(R.id.et_path);ivPic = findViewById(R.id.iv_pic);}public void click(View view) {String s = et_path.getText().toString();HttpUtil02.sendOkHttpRequest(s, new okhttp3.Callback() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {}@Overridepublic void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {InputStream in = response.body().byteStream();bitmap = BitmapFactory.decodeStream(in);Message message = new Message();message.obj = bitmap;handler.sendMessage(message);}});}
}

Android中的OKHttp请求网络相关推荐

  1. okhttp post php,Android_详解Android中使用OkHttp发送HTTP的post请求的方法,HTTP POST 和 PUT 请求可以包含要 - phpStudy...

    详解Android中使用OkHttp发送HTTP的post请求的方法 HTTP POST 和 PUT 请求可以包含要提交的内容.只需要在创建 Request 对象时,通过 post 和 put 方法来 ...

  2. Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切

    Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切 效果: 注意: 1:网络权限 <uses-permission android:name="android.pe ...

  3. Android中的HTTP请求

    在Android 中发送HTTP请求的方式一般有两种,HttpURLConnection和HttpClient,下面介绍的是HttpURLConnection的使用方法. 1.定义xml文件 < ...

  4. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  5. android post方法吗,Android中使用Post请求的方法

    本文实例讲述了Android中使用Post请求的方法.分享给大家供大家参考.具体如下: 一.需要用到的场景 在jQuery中使用$.post()就可以方便的发起一个post请求,在android程序中 ...

  6. 抓包工具Fidder详解(主要来抓取Android中app的请求)

    $*********************************************************************************************$ 博主推荐 ...

  7. Android中使用retrofit2进行网络get请求查询数据和post请求上传文件

    场景 Retrofit2 Retrofit 是对 OkHttp 的封装,是主流的网络框架. 适用于Android 和 Java 的类型安全的HTTP客户端,由Square提供的. Retrofit是一 ...

  8. android 请求方式有哪些,Android中的几种网络请求方式详解

    Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面整理四种常用网络请求方式. java.net包中的HttpURLConnection类 Get方式: // Get方式请求 ...

  9. android http常用配置,Android中Retrofit+OkHttp进行HTTP网络编程的使用指南

    Retrofit介绍:Retrofit(GitHub主页https://github.com/square/okhttp)和OkHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库 ...

最新文章

  1. boost::put_get_helper用法的测试程序
  2. Alexa 调整网站排名统计方式
  3. kubernetes(k8s)架构和组件,工作流程 ,资源
  4. cpu中的MMU的作用
  5. linix防火墙设置之顺序设置问题 -- 解决防火墙规则顺序和插入规则到指定序号的问题...
  6. reload端口 tomcat_tomcat上部署网站的三种方式
  7. Vue封装下拉框组件时,为document绑定原生事件addEventlistener(click“),切换页面之后事件还未被摧毁...
  8. IEnumerable和IEnumerator详解
  9. Ubuntu16.04下安装Sublime Sublime Text3
  10. hadoop搭建_阿里云搭建Hadoop集群
  11. mysql优化了解_了解MySQL如何优化
  12. ?Sized 和 Sized
  13. 抹机王怎么一键新机_[电脑] [第六届机王争霸赛]水冷组——十年 by ilas 完工
  14. 关于UIColor这个类的一些不知道的事
  15. html5快手视频播放源码,快手视频解析源码
  16. oracle 存档终点修改,修改归档模式的存档终点 archive log list
  17. 面试题:高速PCB一般布局、布线原则
  18. Intel CPU的型号漫谈
  19. python海龟怎样写字又快又好看_python海龟画图
  20. 第三章 Unity基础之API

热门文章

  1. WEB1.0起源:全球首个网站info.cern.ch
  2. VScode格式化HTML代码保持标签属性不换行
  3. c0000021a 错误和asms的处理
  4. 如何建立医院患者满意度测评指标体系
  5. 特征选择之relief及reliefF算法
  6. 计算机一级考试在线打字,计算机一级操作题
  7. [多屏互动] 实现双多屏异显二:startActivity方式
  8. HTC G13解锁与越狱成功(转)以及刷机
  9. [分期付款] 建行安居分期,刚申请过,最高额度居然能申请到100万!汗。。
  10. java中javaSE与javaEE的区别(适合新人)