安卓基础学习 Day23 |HTTP框架-OKHttp3

目录

  • 写在前面的话
  • 一、概述
  • 二、GET和POST请求
    • (一)步骤展示
    • (二)效果展示
  • 补充

写在前面的话

1、主要参考自:https://b23.tv/FABE0n
2、内容如果有不对的,希望可以指出或补充。
3、新知识。

一、概述

OKHttp:是一个高效的HTTP客户端。支持get请求和post请求,支持基于Http/https的(大)文件上传和下载,支持加载图片,支持连接同一个地址的链接共享同一个socket(计算机之间进行通信的一种约定或一种方式),通过连接池来减小响应延迟,还有下载文件透明的GZIP压缩(网站压缩加速的一种技术),请求缓存等优势。用于替代HttpUrlConnection和AsyncHttpClient

其核心主要有:路由、连接协议、拦截器(主要是指添加、移除或转换请求或回应的头部信息)、代理、安全性认证、连接池以及网络适配。

这个框架也是square公司开源的一个网络请求库(okhttp内部依赖okio)。已被Google使用在Android源码上。

OKHttp使用时必须在子线程中执行

二、GET和POST请求

(一)步骤展示

1 依赖

对应的build.gradle文件
安卓基础学习 Day23 |HTTP框架-OKHttp3_第1张图片
项目清单文件
安卓基础学习 Day23 |HTTP框架-OKHttp3_第2张图片
2 布局
安卓基础学习 Day23 |HTTP框架-OKHttp3_第3张图片
3 代码

MainActivity.java

package com.example.testokhttp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.IOException;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
     
    private static final int GET = 1;
    private static final int POST = 2;

    private Button btnGet,btnPost;
    private TextView tvResult;
    private OkHttpClient client = new OkHttpClient();

    //解决不能在子线程中显示在文本上
    private Handler handler = new Handler(){
     
        @Override
        public void handleMessage(Message msg) {
     
            super.handleMessage(msg);
            switch (msg.what){
     
                case GET:
                    tvResult.setText((String) msg.obj);//获取数据
                    break;
                case POST:
                    tvResult.setText((String) msg.obj);//获取数据
                    break;
            }
        }
    };

    //编码配置
    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
     
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取控件
        btnGet = findViewById(R.id.btn_get);
        btnPost = findViewById(R.id.btn_post);
        tvResult = findViewById(R.id.tv_result);
        //设置点击事件
        btnGet.setOnClickListener(this);
        btnPost.setOnClickListener(this);
    }

    @Override
    //点击事件
    public void onClick(View v) {
     
        switch (v.getId()){
     
            //使用原生的okhttp请求网络数据-get、post
            case R.id.btn_get:
                getDataFromGet();
                break;
            case R.id.btn_post:
                getDataFromPost();
                break;
        }
    }

    //开启子线程,调get方法
    private void getDataFromGet() {
     
        //new一个子线程
        new Thread(){
     
            @Override
            public void run() {
     
                super.run();
                try {
     
                    String result = get("http://wwww.baidu.com");

                    Message msg = Message.obtain();
                    msg.what = GET;
                    msg.obj = result;//携带返回的数据
                    handler.sendMessage(msg);//发到这
                } catch (IOException e) {
     
                    e.printStackTrace();
                }
            }
        }.start();
    }
    //开启子线程,调post方法
    private void getDataFromPost() {
     
        //new一个子线程
        new Thread(){
     
            @Override
            public void run() {
     
                super.run();
                try {
     
                    String result = post("https://api.github.com/markdown/raw","");

                    Message msg = Message.obtain();
                    msg.what = POST;
                    msg.obj = result;//携带返回的数据
                    handler.sendMessage(msg);//发到这
                } catch (IOException e) {
     
                    e.printStackTrace();
                }
            }
        }.start();
    }

    //异步GET请求-默认get请求
    private String get(String url) throws IOException{
     
        Request request = new Request.Builder()
                .url(url)
                .build();
        Response response = client.newCall(request).execute();
        return response.body().string();
    }
    //post请求
    //参数-json:上传数据时需要
    private String post(String url, String json) throws IOException{
     
        RequestBody body = RequestBody.create(JSON, json);

        Request request = new Request.Builder()
                .url(url)
                .post(body)//
                .build();
        Response response = client.newCall(request).execute();
        return response.body().string();
    }
}

(二)效果展示

运行结果如下。

明天继续。

补充

1、Okhttp3基本使用

2、Socket技术详解

3、下载地址

你可能感兴趣的:(学习日志)