Android OkHttp详解

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中不能传中文
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
代码演示
布局文件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();
        }
    }
};
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值