安卓基礎學習 Day23 |HTTP框架-OKHttp3

寫在前面的話

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文件

項目清單文件

2 佈局

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、下載地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章