Android访问网络OkHttp的使用

本文详细介绍了OkHttp3在Android开发中的基本用法,包括创建Client、Request、异步GET/POST表单提交,以及关键API的使用示例。它是Android开发者首选的网络通信框架,简化了HTTP操作并提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

        OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于http的 文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免 重复的网络请求,支持使用连接池来降低响应延迟问题。

        OkHttp丌仅在接口封装上面做得简单易用,就连在底层实现上也是自成一派,比 起原生的HttpURLConnection,可以说是有过之而无不及,现在已经成为广大 Android开发者首选的网络通信库。

        OkHttp的项目主页地址是:https://github.com/square/okhttp

注意: OkHttp有2.0版本和3.0的版本,目前常用的是OkHttp3

 二、OkHttp的基本用法

        在使用OkHttp之前,我们需要先在项目中添加OkHttp库的依赖。编辑 app/build.gradle文件在dependencies闭包中添加如下内容:

  1、步骤1:创建OkHttpClient类的实例

OkHttpClient client = new OkHttpClient();

  2、步骤2:创建Request对象(并设置目标地址、请求方式等)

  3、步骤3:调用newCall()方法来创建call对象

Call call = client.newCall(request);

  4、步骤4:发送请求并获取服务器返回的数据(同步、异步)

        同步请求:执行请求的操作是阻塞式,直到HTTP响应返回。如果当前 OkHttpClient已经执行了一个同步任务,如果这个任务没有释放锁,那么新发起的请 求将被阻塞,直到当前任务释放锁。同步请求对应OkHttp中的execute()方法

        异步请求:执行的是非阻塞式请求,它的执行结果一般都是通过接口回调的方式告 知调用者。同一时刻可以发起多个请求,因为异步请求每一个都是在一个独立的线程, 由线程队列管理。异步请求对应OkHttp中的enqueue()方法

注意 contentType主要包括以下几种数据格式:

MediaType 常见的数据格式
数据格式说明
multipart/form-data表单形式提交,既可以上传键值对,也可以上传文件
application/x-www-from-urlencoded以键值对的数据格式提交
raw

选择 text,则请求头是: text/plain

选择 javascript,则请求头是: application/javascript

选择 json,则请求头是: application/json

选择 html,则请求头是: text/html

选择 application/xml,则请求头是: application/xml

binary

相当于Content-Type:application/octet-stream,

只可以上传二进制数 据,通常用来上传文件,

由于没有键值,一次只能上传一个文件

  5、举例1:POST方式提交表单

三、代码详解

  1、layout1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

  2、activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

  3、MainActivity.java

package com.example.zsokhttp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import org.jetbrains.annotations.NotNull;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    //定义TextView对象
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout1);

        //将TextView对象和布局文件中的控件进行关联
        textView = findViewById(R.id.tv);

        //1.创建OkHttpClient类的实例
        OkHttpClient client = new OkHttpClient();

        //2.创建Request对象,并设置目标网络地址、请求方式等
        Request request = new Request.Builder()
                        .url("https://www.baidu.com")
                        .get()
                        .build();
        //3.通过前面定义的OkHttpClient对象来调用newCall()方法创建call对象
        Call call = client.newCall(request);

        //4.发起请求并获取服务器返回的数据(异步)
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                //服务器访问失败时的处理操作
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                //接受并处理从服务器返回的数据
                String responseData = response.body().string();
                showResponse(responseData);
            }
        });

    }

    private void showResponse(final String responseData) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //在这里进行UI操作,将结果显示到界面上
                textView.setText(responseData);
            }
        });

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撩得Android一次心动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值