Android开发实例——Okhttp使用

在Android开发网络编程中,Okhttp已然成为了最火热的轻量级框架。本篇文章主要介绍Okhttp框架中的get和post方法使用。

1. 什么是Okhttp

Okhttp是由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)的网络框架。先来到Okhttp官网看看官方文档。相较于传统网络请求框架,Okhttp具有如下优点:

  • 允许连接到同一个主机地址的所有请求,提高请求效率
  • 共享Socket,减少对服务器的请求次数
  • 通过连接池,减少了请求延迟
  • 缓存响应数据来减少重复的网络请求
  • 减少了对数据流量的消耗
  • 自动处理GZip压缩
  • 除了最基础的get和post方法,Okhttp框架还提供文件上传下载,加载图片,支持请求回调,直接返回对象、对象集合,支持session的保持。

2. 为工程添加依赖

在Android studio中新建Android项目后,打开project视图,app目录下的build.gradle文件,在dependencies{ }中添加Okhttp依赖。

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

在这里插入图片描述
完成后记得 Sync now

3. 添加测试布局文件

修改activity_main.xml布局文件,添加两个Button和一个Textview

<Button
    android:id="@+id/get"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="getOkhttp" />

<Button
    android:id="@+id/post"
    android:layout_below="@+id/get"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="postOkhttp" />

<TextView
    android:id="@+id/Response"
    android:layout_below="@id/post"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

记得在Mainacticity中声明控件,注册监听器。

4. 测试POST&GET方法

4.1 GET方法

This program downloads a URL and prints its contents as a string.

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

需要注意的是:由于网络连接非常耗时,Android不允许在主线程进行网络连接!因此我们需要改写一下代码,new一个新线程:

private void getOkhttp(){
    new Thread(new Runnable() {
        @Override
        public void run() {
			try{
			    OkHttpClient client =new OkHttpClient();
			    Request request = new Request.Builder()
			            .url("http://www.baidu.com")
			            .build();
			    Response response = client.newCall(request).execute();
			    String Data = response.body().string();
			    showData(Data);
			}catch (Exception e){
			    e.printStackTrace();
			}
        }
    }).start();
}

是的你没看错,我们又将网络请求的返回数据Response传出来了,因为我们在子线程中进行网络请求,而得到返回后,并不能在这个线程中更新UI,于是我们又必须回到主线程(也叫UI线程)更新UI界面显示返回数据:

private void showData(final String Data){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //
            resp.setText(Data);
        }
    });
}

最后,不要忘了在AndroidManifest中添加网络权限:

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

这是我们利用Okhttp的get方法获得的百度页面数据:
在这里插入图片描述

4.2 POST方法

This program posts data to a service

public static final MediaType JSON
    = MediaType.get("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(json, JSON);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

post方法使用本质上和get相同,他能向服务器发送更多的数据,基于这一点,我们需要构建一个Request Body对象存放需要向服务器提交的数据:

private void postOkhttp(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                OkHttpClient client =new OkHttpClient();
                RequestBody requestBody = new FormBody.Builder()
                        .add("zfk","666666")
                        .build();

                Request request = new Request.Builder()
                        .url("http://www.baidu.com")
                        .method("POST",requestBody)
                        .build();
                Response response = client.newCall(request).execute();
                String Data = response.body().string();
                showData(Data);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }).start();
}

同样可以正确得到返回:
在这里插入图片描述

5. 总结&更多

Okhttp框架使用的关键在于主线程与子线程间的切换,在Android中:

  • 网络请求必须在子线程中进行
  • 网络请求返回的数据必须在主线程中更新UI界面

在Okhttp项目实战中,我们通常将网络请求操作封装在一个公共类,提供几个静态方法。使用时调用这些方法即可。这时我们可以使用:

client.newCall(request).enqueue(callback);

来替代execute()。可以看到我们使用这个方法时传入了okhttp3.Callback参数,enqueue方法已经自动开启了子线程,于是我们不再需要额外开启子线程。最后会在okhttp3.Callback中回调返回的数据,在UI线程中更新UI。


  • 扫描关注 " 有趣的技术小窝",看天马行空的技术杂谈; 获实用的软件、资料分享
    在这里插入图片描述
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值