android okhttp异步请求使用详解

okhttp

  • 一、OKHttp简介
    • okhttp导入
    • okhttp主要功能
  • 二、okhttp基本使用
    • 1.发起get异步请求
    • 2.发起post提交请求
    • 总结

一、OKHttp简介

OkHttp 是一款高效的 HTTP 客户端,内部依赖okio,它有以下优点:

  • HTTP/2 支持允许对同一主机的所有请求共享同一个socket。
  • 连接池可减少请求延迟(如果 HTTP/2 不可用)。
  • 透明 GZIP 可缩小下载大小。
  • 响应缓存可完全避免重复请求的网络。

okhttp导入

okhttp官网地址
OkHttp 3.12.x 及以下的版本支持 Android 2.3+(API 级别 9+)和 Java 7+。同时还要导入okhttp依赖的okio库,而Okio在1.x版本是基于Java实现的,2.x则是Kotlin实现的。这里我的Android版本是2.3,基于Java实现。
在项目中的app目录下的build.gradle文件中添加以下代码

dependencies { // okhttp3的依赖
    compile 'com.squareup.okhttp3:okhttp:3.8.1'
    compile 'com.squareup.okio:okio:1.12.0'}

在AndroidManifest.xml中添加网络权限 :

    

okhttp主要功能

  • 联网请求文本数据
  • 大文件下载上传
  • 请求图片

二、okhttp基本使用

1.发起get异步请求

布局文件很简单,只有几个按钮

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity ";
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn= (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try{
                  getRequest("http://api.m.mtime.cn/PageSubArea/TrailerList.api");
                }catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
        });
    }
    /*
    get请求
    url网络连接
     */
    public void getRequest(String url) throws IOException {
        //要有一个客户端,类似于要有一个浏览器
        OkHttpClient client = new OkHttpClient.Builder()
                .build();
        //创建请求内容
        Request request = new Request.Builder()
                .get()
                .url(url)
                .build();
        //用client去创建请求任务
        okhttp3.Call task=client.newCall(request);
        //异步请求,发起请求可以继续做其他事情(同步请求,发起请求之后要等数据回来)
        task.enqueue(new Callback() {
            @Override
            public void onFailure(okhttp3.Call call, IOException e) {

                Log.d(TAG,"onFailure->"+e.toString());
            }
            @Override
            public void onResponse(okhttp3.Call call, Response response) throws IOException {
                ResponseBody body=response.body();
                Log.d(TAG,"onSuccess->"+body.string());
            }
        });
    }
}

运行结果,点击按钮后,logcat打印出获取的内容
在这里插入图片描述

2.发起post提交请求

post请求和get请求不同的是post需要一个RequestBody的参数。RequestBody是一个抽象类,分别有FormBody和MultipartBody两个子类。FormBody,用于传输表单类型的参数。MultipartBody则支持多类型的参数传递。

public void post(String url){
       //创建一个RequestBody对象
      RequestBody body = new FormBody.Builder()
              .add("date", "2018-08-13")
              .build();
                    //先有Client
      OkHttpClient client = new OkHttpClient.Builder()
              .build();
              //创建请求
      Request request=new Request.Builder()
              .url(url)
              .post(body)
              .build();
              //创建请求任务
      okhttp3.Call task=client.newCall(request);
      task.enqueue(new Callback() {
          @Override
          public void onFailure(okhttp3.Call call, IOException e) {

          }

          @Override
          public void onResponse(okhttp3.Call call, Response response) throws IOException {
              ResponseBody body=response.body();
              Log.d(TAG,"onSuccess->"+body.string());
          }
      });
  }

总结

get请求和post请求主要分4步:

  • 首先创建一个客户端,创建一个OkHttpClient对象,OkHttpClient client = new OkHttpClient.Builder() .build();
  • 其次创建请求Request对象,描述请求内容
    Request request = new Request.Builder()
    .get()
    .url(url)
    .build();

    如果是post则需要一个传入一个RequestBody对象作为参数。

  • 然后用创建的客户端去创建请求任务
    okhttp3.Call task=client.newCall(request);
  • 最后去执行该任务,具体执行可参考上述的代码。

你可能感兴趣的:(android okhttp异步请求使用详解)