Android学习笔记之——okhttp的使用

Android学习笔记之——OkHttp的使用

       书不尽言,言不尽意,他山之石,可以攻玉。这次的博客我们来探讨下安卓开发中OkHttp的使用,您宝贵的意见可以让我明白自己的不足之处,并加以改正,在此谢谢各位了!

博客将涉及到以下几点:

  1. 为什么要使用OkHttp
  2. 如何使用OkHttp

那么废话不多说,直接开始吧

1、为什么要使用OkHttp

      我们知道在安卓开发中要发送HTTP请求有个原生的方法HttpURLConnection,那么为什么还要使用第三方的OkHttp呢?我们先来了解下OkHttp,OkHttp是由Square公司开发的开源项目,地址为点击打开链接。OkHttp在接口封装上非常简单易用,比起原生的HttpURLConnection,真的是方便的多了,到底有多方便呢?我们来做个对比,分别使用HttpURLConnection和OkHttp访问点击打开链接,看看他们的代码差异。

首先自然是创建个布局

    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.zby.bloghttp.MainActivity">
    <Button
        android:id="@+id/btn_sendRequest"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送网络请求"/>
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/tv_response"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
    </ScrollView>


</LinearLayout>
很简单的布局,用一个按钮发送请求后,将请求的结果显示在TextView中,由于请求的文本可能过长,所以将TextView包裹在ScrollView里进行滚动。

布局好了,我们就来修改下MainActivity里的内容,首先试试用HttpUrlConnection请求网络
public class MainActivity extends AppCompatActivity {
    private Button btn_sendResqust;
    private TextView tv_response;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_sendResqust = (Button) findViewById(R.id.btn_sendRequest);
        tv_response = (TextView) findViewById(R.id.tv_response);
        btn_sendResqust.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendRequestWithHttpUrlConnection();//使用HttpUrlConnection访问

            }
        });
    }

}

将控件初始化,给按钮绑定监听事件让他处理一个自定义的sendRequestWithHttpUrlConnection方法,接着我们看看这个方法里的内容

private void sendRequestWithHttpUrlConnection() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url=new URL("https://raw.githubusercontent.com/square/okhttp/master/LICENSE.txt");
                    HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    InputStream in=connection.getInputStream();
                    BufferedReader reader=new BufferedReader(new InputStreamReader(in));
                    final StringBuilder response =new StringBuilder();
                    String line=null;
                    while ((line=reader.readLine())!=null){
                        response.append(line);
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            tv_response.setText(response);
                        }
                    });
                    reader.close();
                    in.close();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();

    }

很常用的写法,开启线程获取URL,获取HttpURLConnection,设置connection属性,通过connection把内容传给IO流处理,再更新TextView的UI(注意 UI不能在子线程更新,所以使用了runOnUiThread方法回到主线程更新UI)。

最后,因为要访问网络,所以别忘了获取网络权限

 <uses-permission android:name="android.permission.INTERNET"/>

现在运行下程序并点击按钮,结果如下


毫无意外的获取到了数据并展现了出来,显然HttpURLConnection已经很好用了,但HttpURLConnection不是我们这次关注的目标,所以我们现在来对比下OkHttp是如何实现同样的功能的。

使用第三方库自然要先在Android studio中进行配置,如下

 compile 'com.squareup.okhttp3:okhttp:3.10.0'

配置完成后,修改MainActivity中按钮的点击事件

btn_sendResqust.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //sendRequestWithHttpUrlConnection();
                sendRequestWithOkHttp();
            }
        });

这次我们自定义了sendRequestWithOkHttp方法,用此方法来使用OkHttp获取请求,现在我们来看看这个方法的具体内容

private void sendRequestWithOkHttp() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client=new OkHttpClient();
                    Request.Builder builder=new Request.Builder();
                    builder.url("https://raw.githubusercontent.com/square/okhttp/master/LICENSE.txt");
                    Request request=builder.build();
                    Response response=client.newCall(request).execute();
                    final String responseData=response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            tv_response.setText(responseData);
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

初看一眼,代码量少了很多,我们先不详讲,首先看下运行结果,如下:


同样获取到了请求,并更新了UI,同时我们发现了个额外的惊喜,对比上图,那就是OkHttp帮我们把文本缩进也做了!

写到这你可能已经感觉到OkHttp的优点了,但是OkHttp是怎么做到的呢?你现在或许还一脸懵逼,但没关系,接下来,我们将详细了解下OkHttp.那么让我们进入第二步:如何使用OkHttp。

2、如何使用OkHttp

OkHttp的基本用法

要使用OkHttp,首先要创建一个OkHttpClient实例,如下:

OkHttpClient client=new OkHttpClient();

拿到OkHttpClient实例后,要想发起一条HTTP请求,就要创建一个Request 对象,但是OkHttp没法直接构建Request,通常都是基于构建者模式,借助Request.Builder工具类构建出Request.Builder对象,再通过builder的url方法,通过字符串形式请求到url地址,再通过builder.build()方法就能够获得Request对象了。我们看下之前那段代码这三行:

    Request.Builder builder=new Request.Builder();
    builder.url("https://raw.githubusercontent.com/square/okhttp/master/LICENSE.txt");
    Request request=builder.build();                    

就这样拿到Request对象后,我们就可以通过client.newCall(request)方法,告诉client我们的请求就是这个request,然后使用client.newCall(request)方法,就会给我们返回一个Call的对象,最后通过Call对象的execute()方法,就获取到了Response对象了,代码如下:

Response response=client.newCall(request).execute(); 

这里我用了连缀的写法将这些方法都写在了一行,这样服务器返回的数据我们就拿到了,由于我们要得到数据的具体内容来更新TextView的内容,所以使用以下写法来得到内容:

final String responseData=response.body().string();

这样的话OkHttp的基本用法就介绍完了,但是或许你还有些疑问Response中有哪些内容,所以接下来我将会介绍下Response

Response

Response包含三个部分:返回码code、响应头header、响应体body

我们先来获取下Response看下里面的内容:

这里我对布局做了改变,新增加了个按钮用于获取Response内容,并在按钮的点击事件了写了个getResponseContent的方法。


btn_responseContent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getResponseContent();
            }
        });

接着我们看看getResponseContent方法的具体内容:

private void getResponseContent() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Request.Builder builder = new Request.Builder();
                builder.url("https://raw.githubusercontent.com/square/okhttp/master/LICENSE.txt");
                Request request = builder.build();
                Call call = mClient.newCall(request);
                try {
                    Response response=call.execute();
                    int code = response.code();
                    Headers headers = response.headers();
                    String body = response.body().toString();
                    final StringBuilder responseDate = new StringBuilder();
                    responseDate.append("code:" + code);
                    responseDate.append("\nheaders:" + headers);
                    responseDate.append("\nbody:" + body);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            tv_response.setText(responseDate.toString());
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

运行下结果,点击获取RESPONSE内容:


运行结果中显示的内容就是Response的所有内容,下面我们进行下分析:

响应体body我们前面已经看到了,就是之前TextView里的一大串文字。

返回码code不用多说,这里返回的是200,代表的请求成功,常见的有:

200 ok 请求已成功,请求所希望的响应头或数据体将随此响应返回。

202 Accepted 服务器已经接受请求,但尚未处理。 

404 Not Found请求所需要的资源为在服务器上被发现。 

501 Not Implemented服务器不支持当前请求所需要的某个功能。

505 HTTP Version Not Supported服务器不支持,或者拒绝支持在请求中使用的HTTP版本。 

具体的其他返回码可以参考其他资料。

响应头headers,我们通过运行结果可以看出,他是由一堆keys和values组成的键值对。当客服端有具体的需要时,就能通过get它的key,获取到具体的值来进行具体的操作了,

好了,这次的学习笔记想写的就写到这了,OkHttp还有很多复杂的操作,在后续会进行补充,感谢您花费宝贵的时间进行观看,期待有缘再见!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值