下面我将从核心概念、常见通信方式、代码示例和最佳实践四个方面,为你详细讲解 Java 与 Android 如何通信。
核心概念:客户端-服务器模型
首先要理解,Java (后端) 和 Android (前端) 的通信本质上是客户端-服务器模型。
- 服务器端: 由 Java 编写,负责业务逻辑处理、数据持久化、提供 API 接口,它监听来自客户端的请求,处理请求,并返回响应数据。
- 客户端: 即 Android App,负责用户界面展示、用户交互,它会向服务器发送请求(如登录、获取数据),并接收和展示服务器返回的数据。
它们之间通过网络进行数据交换,通常使用 HTTP/HTTPS 协议,数据格式则通常是 JSON,因为它轻量、易于人阅读,并且与 Java 和 Android 的数据结构都能很好地映射。
常见通信方式
目前主流的通信方式已经从传统的 REST API 演进到了更高效的实时通信。
RESTful API (最主流、最基础)
这是目前最广泛使用的方式,后端服务器暴露一系列 URL 接口(端点),客户端通过 HTTP 方法(GET, POST, PUT, DELETE)来对这些 URL 进行操作,实现资源的增删改查。
- 特点:
- 无状态: 每个请求都包含所有必要信息,服务器不保存客户端状态。
- 基于 HTTP: 使用标准的 HTTP 协议,通用性强。
- 数据格式: 通常使用 JSON 或 XML。
- 工作流程:
- Android App 发起一个 HTTP 请求(使用
GET方法请求https://api.example.com/users/123)。 - Java 服务器接收到请求,根据 URL 和方法执行相应的业务逻辑(如查询数据库)。
- 服务器将查询结果(如一个用户对象)序列化为 JSON 字符串。
- 服务器将 JSON 字符串作为 HTTP 响应体返回给 Android App,并设置正确的
Content-Type(如application/json)。 - Android App 接收到响应,解析 JSON 数据,并更新 UI。
- Android App 发起一个 HTTP 请求(使用

WebSocket (实时通信)
当需要服务器主动向客户端推送数据时(如聊天室、实时通知、股票行情),REST API 就显得力不从心了,因为它只能由客户端主动拉取数据。
- 特点:
- 全双工通信: 服务器和客户端可以同时、双向地发送消息。
- 持久连接: 在连接建立期间,会话一直保持,无需为每个请求重新建立连接。
- 低延迟: 非常适合实时场景。
- 工作流程:
- Android App 发起一个 HTTP 请求,请求升级协议为
WebSocket。 - Java 服务器同意升级,建立一条持久的 TCP 连接。
- 之后,任何一方都可以通过这条连接随时向对方发送消息,无需等待对方请求。
- Android App 发起一个 HTTP 请求,请求升级协议为
代码示例
下面我们通过最常用的 RESTful API + JSON 方式,给出 Java 后端和 Android 前端的代码示例。
场景:从 Android 获取一个用户列表。
Java 后端 (使用 Spring Boot 框架)
Spring Boot 是目前最流行的 Java 后端框架,能快速创建独立的、生产级别的 Spring 应用。
a. 添加依赖 (pom.xml)
<dependencies>
<!-- Spring Web 提供了 RESTful 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 用于将 Java 对象转换为 JSON -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
b. 创建数据模型
// User.java
public class User {
private Long id;
private String name;
private String email;
// Getters and Setters (省略...)
// 构造函数 (省略...)
}
c. 创建控制器
// UserController.java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
@RestController // @RestController = @Controller + @ResponseBody
@RequestMapping("/api/users") // 定义基础路径
public class UserController {
@GetMapping // 映射 GET 请求到 /api/users
public List<User> getAllUsers() {
// 模拟从数据库获取数据
List<User> users = Arrays.asList(
new User(1L, "Alice", "alice@example.com"),
new User(2L, "Bob", "bob@example.com")
);
// Spring Boot 会自动将 List<User> 序列化为 JSON 并返回
return users;
}
}
当你启动 Spring Boot 应用后,访问 http://localhost:8080/api/users,你会得到如下 JSON 响应:
[
{
"id": 1,
"name": "Alice",
"email": "alice@example.com"
},
{
"id": 2,
"name": "Bob",
"email": "bob@example.com"
}
]
Android 前端 (使用 Retrofit + OkHttp + Coroutines)
在 Android 中,我们不会直接使用 HttpURLConnection,而是使用更现代、更高效的网络库。
- Retrofit: 类型安全的 HTTP 客户端,它将 HTTP API 转换成一个 Java 接口。
- OkHttp: 高效的 HTTP 客户端,Retrofit 默认使用它。
- Coroutines/Kotlinx Serialization: 用于处理异步和 JSON 序列化/反序列化。
a. 添加依赖 (build.gradle.kts / build.gradle)
// build.gradle
dependencies {
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // Gson 转换器
// Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2' // lifecycleScope
// OkHttp (Retrofit 已包含,但有时需要单独配置)
implementation 'com.squareup.okhttp3:okhttp:4.11.0'
}
b. 添加网络权限 (AndroidManifest.xml)
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application ...>
...
</application>
</manifest>
c. 定义数据模型
// User.kt
data class User(
val id: Long,
val name: String,
val email: String
)
d. 创建 Retrofit API 接口
// UserService.kt
import retrofit2.http.GET
interface UserService {
@GET("api/users") // 对应 Java 后端的 /api/users
suspend fun getUsers(): List<User> // 使用 suspend 关键字使其可在协程中调用
}
e. 初始化 Retrofit 实例
// RetrofitClient.kt
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitClient {
private const val BASE_URL = "http://10.0.2.2:8080/" // Android 模拟器访问本地电脑的地址
val instance: UserService by lazy {
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
retrofit.create(UserService::class.java)
}
}
注意: 在 Android 模拟器中,访问
localhost或0.0.1指的是模拟器本身,要访问你电脑上的本地服务器,需要使用0.2.2。
f. 在 ViewModel 或 Activity 中调用
// MyViewModel.kt
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class MyViewModel : ViewModel() {
private val _users = mutableListOf<User>()
val users: List<User> = _users
fun fetchUsers() {
viewModelScope.launch { // 在协程作用域内执行网络请求
try {
val userList = RetrofitClient.instance.getUsers()
_users.clear()
_users.addAll(userList)
// 更新 UI...
} catch (e: Exception) {
// 处理错误,如网络连接失败
e.printStackTrace()
}
}
}
}
最佳实践与注意事项
-
安全性:
- HTTPS: 永远使用 HTTPS,而不是 HTTP,它可以加密数据,防止中间人攻击。
- 身份验证: 不要在 URL 或请求体中硬编码敏感信息(如 API Key),使用更安全的方式,如 OAuth2.0 或 Bearer Token,并在请求头中传递。
-
性能:
- 异步操作: 网络请求是耗时操作,绝对不能在主线程(UI线程)中执行,否则会导致应用卡顿甚至崩溃,Android 会在 API 23+ 强制要求网络请求在后台线程执行,使用 Kotlin Coroutines, RxJava 或
AsyncTask(已废弃) 来处理。 - 数据缓存: 对于不经常变化的数据(如配置信息),可以实现缓存机制,减少不必要的网络请求,提升用户体验和降低服务器压力。
- 异步操作: 网络请求是耗时操作,绝对不能在主线程(UI线程)中执行,否则会导致应用卡顿甚至崩溃,Android 会在 API 23+ 强制要求网络请求在后台线程执行,使用 Kotlin Coroutines, RxJava 或
-
架构:
- 关注点分离: 将网络请求逻辑与 UI 逻辑分开,通常使用 MVVM (Model-View-ViewModel) 架构,ViewModel 负责处理数据获取,Activity/Fragment 只负责展示数据。
- 错误处理: 提供健壮的错误处理机制,当网络请求失败时,应向用户显示友好的提示,而不是让 App 崩溃。
-
现代趋势:
- Kotlin: Android 开发已全面转向 Kotlin,Kotlin 的协程、数据类等特性使其成为处理网络请求和 JSON 数据的理想选择。
- GraphQL: 作为 REST API 的替代方案,GraphQL 允许客户端精确地请求它需要的数据,避免了 REST 中过度获取或获取不足的问题,在复杂应用中越来越受欢迎。
- gRPC: 使用 HTTP/2 和 Protocol Buffers,性能极高,适合对性能要求极高的微服务通信。
| 特性 | RESTful API | WebSocket |
|---|---|---|
| 通信模式 | 客户端请求,服务器响应 | 双向实时通信 |
| 连接类型 | 无状态,短连接 | 有状态,长连接 |
| 数据格式 | JSON, XML | 通常为自定义文本或 Protobuf |
| 适用场景 | 数据的 CRUD 操作(如获取列表、提交表单) | 聊天、实时通知、在线游戏、数据推送 |
对于大多数 App RESTful API 是基础和核心,当需要实现实时功能时,可以在此基础上引入 WebSocket。
从技术栈上看,Java (Spring Boot) + Android (Kotlin + Retrofit) 是一个非常成熟、强大且高效的组合,是当前 App 开发的主流选择。
