Android OkHttp详解
效果图
GET请求 POST请求
OkHttp
首先,我们要先了解一些背景,OkHttp这个框架是有Square公司推出的,进入官网。如果想看API,点击进入API。大概了解了OkHttp之后我们应该知道OkHttp是一个网络框架,学习Android开发的时候接触的HttpURLConnection和Apache提供的HttpClient这两个类,然后就是后面推出的一些第三方网络框架。
概念:OkHttp是用来替换HttpURLConnection的,android4.4源码的HttpURLConnection替换成了OkHttp。所以OkHttp和这些网络框架比,这些网络框架也只是基于HttpURLConnection进行一些封装,使我们的代码更加简洁方便。okhttp已经提供了对应的okhttp-apache 模块。
HttpURLConnection和OkHttp的比较
优点
1.HttpURLConnection有的API,OkHttp基本上都有
2.HttpURLConnection和OkHttp都支持Https,流的上传和下载,超时,IP6、连接池等等
3.OkHttp比HttpURLConnection具有更好的同步异步请求、缓存机制,支持HttpDNS、重定向、Gzip压缩,平台适应性、很好的服务器IP的转换、直接Socket通信,支持拦截器等等。
缺点
1.OkHttp不支持优先级请求
2.OkHttp不支持自签名证书
3.OkHttp header中不能传中文
优点
1.HttpURLConnection有的API,OkHttp基本上都有
2.HttpURLConnection和OkHttp都支持Https,流的上传和下载,超时,IP6、连接池等等
3.OkHttp比HttpURLConnection具有更好的同步异步请求、缓存机制,支持HttpDNS、重定向、Gzip压缩,平台适应性、很好的服务器IP的转换、直接Socket通信,支持拦截器等等。
缺点
1.OkHttp不支持优先级请求
2.OkHttp不支持自签名证书
3.OkHttp header中不能传中文
okHttp、volley、android-async-http对比:
volley是一个简单的异步http库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件
android-async-http。与volley一样是异步网络库,但volley是封装的httpUrlConnection,它是封装的httpClient,而android平台不推荐用HttpClient了,所以这个库已经不适合android平台了。
okhttp是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。
okHttp介绍:
官网地址:点击打开链接
官方API地址:点击打开链接
github源码地址:点击打开链接
okHttp主要类:
1.OkHttpClient.java
2.Request.java
3.Call.java
4.RequestBody.java
5.Response.java
volley是一个简单的异步http库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件
android-async-http。与volley一样是异步网络库,但volley是封装的httpUrlConnection,它是封装的httpClient,而android平台不推荐用HttpClient了,所以这个库已经不适合android平台了。
okhttp是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。
okHttp介绍:
官网地址:点击打开链接
官方API地址:点击打开链接
github源码地址:点击打开链接
okHttp主要类:
1.OkHttpClient.java
2.Request.java
3.Call.java
4.RequestBody.java
5.Response.java
代码演示
布局文件activity_main,在布局文件中添加两个Button用于GET POST点击事件做不同的事情,ImageView用于GET请求显示图片
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.chenxiaoyang.okhttp.MainActivity"> <Button android:text="Get请求" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:id="@+id/button"/> <Button android:text="Post请求" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/button" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:id="@+id/button2"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:id="@+id/imageView"/> </RelativeLayout>
首先在Button的点击事件中添加一个switch用于Button的点击做不同的事情
1.GET请求:在这里我使用Button点击事件在ImageView上加载一张图片
首先在第一个Button中
//第一步:实例化okHttpClient对象 OkHttpClient okHttpClient = new OkHttpClient(); //第二步:设置请求方式,网址,参数等。最后构建 final Request request = new Request.Builder() //设置请求方式,不写默认为Get .method() // .method("GET",null) .get() .url("http://v1.qzone.cc/pic/201303/18/19/13/5146f6cf48042546.jpg!600x600.jpg") .build(); //第三步:实例化Call对象 Call call = okHttpClient.newCall(request); //第四步:发送异步Get请求 call.enqueue(new Callback() { //请求失败时要做的事情 @Override public void onFailure(Call call, IOException e) { //更新UI线程的另一种方法,可以不用Handle发送 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show(); } }); } //请求成功时要做的事情 @Override public void onResponse(Call call, Response response) throws IOException { //请求完成后还是在子线程中,需要手动更新UI //请求的内容在body正文中 //加载图片代码 InputStream inputStream = response.body().byteStream(); //使用BitmapFactory位图工厂,调用decodeStream方法传递连接对象的输入流数据 Bitmap bitmap = BitmapFactory.decodeStream(inputStream); Message message = Message.obtain(); message.what = 0; message.obj = bitmap; mHandler.sendMessage(message); } });
2.POST请求:在这里我使用Button点击事件使用Toast显示数据
第二个Button
//第一步,实例化OkHttpClient对象 OkHttpClient okHttpClient1 = new OkHttpClient(); //第二步,设置请求 RequestBody requestBody = new FormBody.Builder() .add("league", "英超") .add("key", "7121c58a9280b7d98ca041949fd579f2") .build(); Request request1 = new Request.Builder() .url("http://op.juhe.cn/onebox/football/league") .post(requestBody) .build(); //实例化Call对象 Call call1 = okHttpClient1.newCall(request1); //发送异步GET请求 call1.enqueue(new Callback() { //请求失败时要做的事情 @Override public void onFailure(Call call, IOException e) { // runOnUiThread可以在子线程中进行UI更新 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show(); } }); } //请求成功时要做的事情 @Override public void onResponse(Call call, Response response) throws IOException { //获取响应正文内所有的字符串 String string = response.body().string(); Message message = Message.obtain(); message.what=1; message.obj = string; mHandler.sendMessage(message); } });
3.添加Handler实例化并在其中接收Message传输的数据
private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.what==0){ mImageView.setImageBitmap((Bitmap) msg.obj); }else if(msg.what==1){ Toast.makeText(MainActivity.this, (String) msg.obj, Toast.LENGTH_SHORT).show(); } } };