Android使用HTTP网络服务(OkHttp框架)

OkHttp是目前一个主流的网络框架,可以用其来访问网络,使用起来很简单。
其是由Square公司开发并共享开元的高效的网络访问框架,使用简单,它替代了HttpUrlConnection和Apache的HttpClient

基本使用

首先导入依赖

在gradle中添加一行

implementation("com.squareup.okhttp3:okhttp:4.10.0")

build.gradle完整代码

plugins {
   id 'com.android.application'
}

android {
   namespace 'com.example.myapplication'
   compileSdk 32

   defaultConfig {
       applicationId "com.example.myapplication"
       minSdk 21
       targetSdk 32
       versionCode 1
       versionName "1.0"

       testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   }

   buildTypes {
       release {
           minifyEnabled false
           proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
       }
   }
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }
}

dependencies {

   implementation(platform("com.squareup.okhttp3:okhttp-bom:4.10.0"))

   implementation 'androidx.appcompat:appcompat:1.4.1'
   implementation 'com.google.android.material:material:1.5.0'
   implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
   testImplementation 'junit:junit:4.13.2'
   androidTestImplementation 'androidx.test.ext:junit:1.1.3'
   androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

添加完成后记得点击Sync Now

添加网络权限

同webview,在清单文件中添加以下4行

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

AndroidManifest.xml完整文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

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

    <application
        android:usesCleartextTraffic="true"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>

</manifest>

对于同步请求

在MainActivity中onCreate()函数里添加以下代码

OkHttpClient client = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url("https://www.doubleq666.cn").build();

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Response response = client.newCall(request).execute();
            Log.d("OkHttp", response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

MainActivity.java完整代码

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

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

        OkHttpClient client = new OkHttpClient.Builder().build();
        Request request = new Request.Builder().url("https://www.doubleq666.cn").build();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Response response = client.newCall(request).execute();
                    Log.d("OkHttp", response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
}

Logcat中的输出信息

在这里插入图片描述

对于异步请求

在MainActivity中onCreate()函数里添加以下代码

OkHttpClient client = new OkHttpClient.Builder().build();
        Request request = new Request.Builder().url("https://www.doubleq666.cn").build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {

            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                Log.d("OkHttp", response.body().string());
            }
        });

MainActivity.java完整代码

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

import java.io.IOException;

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

public class MainActivity extends AppCompatActivity {

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

        OkHttpClient client = new OkHttpClient.Builder().build();
        Request request = new Request.Builder().url("https://www.doubleq666.cn").build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {

            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                Log.d("OkHttp", response.body().string());
            }
        });

    }
}

Logcat中的输出信息

在这里插入图片描述

利用同步请求或异步请求就可以实现发送和接收HTTP报文的功能。

为什么同步请求要调用子线程

  • 在Android帮助文档进程线程部分中明确提出了UI(主)线程不能阻塞,否则会影响页面的渲染。
  • 在同步请求的过程中,发送请求报文到服务器后,等待响应报文必然会花费一定的时间,从而形成阻塞。
  • 因此不能在UI(主)线程里发送同步请求,需另开一个worker(子)线程。

帮助文档链接:https://developer.android.com/guide/components/processes-and-threads


版权声明:本文为m0_67256419原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。