Android中的OKHttp请求网络
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请求网络相关推荐
- okhttp post php,Android_详解Android中使用OkHttp发送HTTP的post请求的方法,HTTP POST 和 PUT 请求可以包含要 - phpStudy...
详解Android中使用OkHttp发送HTTP的post请求的方法 HTTP POST 和 PUT 请求可以包含要提交的内容.只需要在创建 Request 对象时,通过 post 和 put 方法来 ...
- Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切
Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切 效果: 注意: 1:网络权限 <uses-permission android:name="android.pe ...
- Android中的HTTP请求
在Android 中发送HTTP请求的方式一般有两种,HttpURLConnection和HttpClient,下面介绍的是HttpURLConnection的使用方法. 1.定义xml文件 < ...
- Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...
- android post方法吗,Android中使用Post请求的方法
本文实例讲述了Android中使用Post请求的方法.分享给大家供大家参考.具体如下: 一.需要用到的场景 在jQuery中使用$.post()就可以方便的发起一个post请求,在android程序中 ...
- 抓包工具Fidder详解(主要来抓取Android中app的请求)
$*********************************************************************************************$ 博主推荐 ...
- Android中使用retrofit2进行网络get请求查询数据和post请求上传文件
场景 Retrofit2 Retrofit 是对 OkHttp 的封装,是主流的网络框架. 适用于Android 和 Java 的类型安全的HTTP客户端,由Square提供的. Retrofit是一 ...
- android 请求方式有哪些,Android中的几种网络请求方式详解
Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面整理四种常用网络请求方式. java.net包中的HttpURLConnection类 Get方式: // Get方式请求 ...
- android http常用配置,Android中Retrofit+OkHttp进行HTTP网络编程的使用指南
Retrofit介绍:Retrofit(GitHub主页https://github.com/square/okhttp)和OkHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库 ...
最新文章
- boost::put_get_helper用法的测试程序
- Alexa 调整网站排名统计方式
- kubernetes(k8s)架构和组件,工作流程 ,资源
- cpu中的MMU的作用
- linix防火墙设置之顺序设置问题 -- 解决防火墙规则顺序和插入规则到指定序号的问题...
- reload端口 tomcat_tomcat上部署网站的三种方式
- Vue封装下拉框组件时,为document绑定原生事件addEventlistener(click“),切换页面之后事件还未被摧毁...
- IEnumerable和IEnumerator详解
- Ubuntu16.04下安装Sublime Sublime Text3
- hadoop搭建_阿里云搭建Hadoop集群
- mysql优化了解_了解MySQL如何优化
- ?Sized 和 Sized
- 抹机王怎么一键新机_[电脑] [第六届机王争霸赛]水冷组——十年 by ilas 完工
- 关于UIColor这个类的一些不知道的事
- html5快手视频播放源码,快手视频解析源码
- oracle 存档终点修改,修改归档模式的存档终点 archive log list
- 面试题:高速PCB一般布局、布线原则
- Intel CPU的型号漫谈
- python海龟怎样写字又快又好看_python海龟画图
- 第三章 Unity基础之API
热门文章
- WEB1.0起源:全球首个网站info.cern.ch
- VScode格式化HTML代码保持标签属性不换行
- c0000021a 错误和asms的处理
- 如何建立医院患者满意度测评指标体系
- 特征选择之relief及reliefF算法
- 计算机一级考试在线打字,计算机一级操作题
- [多屏互动] 实现双多屏异显二:startActivity方式
- HTC G13解锁与越狱成功(转)以及刷机
- [分期付款] 建行安居分期,刚申请过,最高额度居然能申请到100万!汗。。
- java中javaSE与javaEE的区别(适合新人)