Android 网络开发核心知识点
一、基础网络通信
1. HTTP/HTTPS 协议
- HTTP方法:GET、POST、PUT、DELETE等
- 状态码:200(成功)、404(未找到)、500(服务器错误)等
- HTTPS加密:SSL/TLS握手过程
- 报文结构:请求头/响应头、请求体/响应体
2. 网络请求权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
3. 检查网络状态
val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork = connectivityManager.activeNetwork
val capabilities = connectivityManager.getNetworkCapabilities(activeNetwork)
val isConnected = capabilities?.hasCapability(NET_CAPABILITY_INTERNET) ?: false
二、网络请求实现方式
1. HttpURLConnection
val url = URL("https://api.example.com/data")
val connection = url.openConnection() as HttpURLConnection
try {
connection.requestMethod = "GET"
val inputStream = connection.inputStream
val response = inputStream.bufferedReader().use { it.readText() }
} finally {
connection.disconnect()
}
2. OkHttp (最常用)
// 添加依赖
implementation("com.squareup.okhttp3:okhttp:4.9.3")
// 使用示例
val client = OkHttpClient()
val request = Request.Builder()
.url("https://api.example.com/data")
.build()
client.newCall(request).enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
val responseData = response.body?.string()
}
override fun onFailure(call: Call, e: IOException) {
// 处理错误
}
})
3. Retrofit (REST API 最佳选择)
// 添加依赖
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
// 定义API接口
interface ApiService {
@GET("users/{id}")
suspend fun getUser(@Path("id") userId: String): User
}
// 创建Retrofit实例
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val service = retrofit.create(ApiService::class.java)
// 发起请求(Coroutine方式)
lifecycleScope.launch {
try {
val user = service.getUser("123")
} catch (e: Exception) {
// 处理错误
}
}
三、数据解析
1. JSON 解析
Gson:
val gson = Gson() val user = gson.fromJson(jsonString, User::class.java) val json = gson.toJson(user)
Moshi:
val moshi = Moshi.Builder().build() val jsonAdapter = moshi.adapter(User::class.java) val user = jsonAdapter.fromJson(jsonString) val json = jsonAdapter.toJson(user)
2. XML 解析
- Pull Parser:
val parser = Xml.newPullParser() parser.setInput(inputStream, null) var eventType = parser.eventType while (eventType != XmlPullParser.END_DOCUMENT) { when (eventType) { XmlPullParser.START_TAG -> { /* 处理开始标签 */ } XmlPullParser.TEXT -> { /* 处理文本内容 */ } } eventType = parser.next() }
四、高级网络特性
1. 缓存策略
val cache = Cache(File(context.cacheDir, "http_cache"), 10 * 1024 * 1024) // 10MB
val client = OkHttpClient.Builder()
.cache(cache)
.addInterceptor(CacheInterceptor())
.build()
class CacheInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val response = chain.proceed(request)
val cacheControl = CacheControl.Builder()
.maxAge(30, TimeUnit.MINUTES) // 30分钟缓存
.build()
return response.newBuilder()
.header("Cache-Control", cacheControl.toString())
.build()
}
}
2. 文件下载
val request = Request.Builder()
.url(fileUrl)
.build()
client.newCall(request).enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
response.body?.byteStream()?.use { input ->
FileOutputStream(localFile).use { output ->
input.copyTo(output)
}
}
}
override fun onFailure(call: Call, e: IOException) {
// 处理错误
}
})
3. 文件上传
val requestBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.name,
file.asRequestBody("image/jpeg".toMediaType()))
.build()
val request = Request.Builder()
.url(uploadUrl)
.post(requestBody)
.build()
五、网络安全
1. 证书锁定 (Certificate Pinning)
val hostname = "api.example.com"
val certificatePinner = CertificatePinner.Builder()
.add(hostname, "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()
2. 网络安全配置
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">example.com</domain>
<trust-anchors>
<certificates src="@raw/my_ca"/>
</trust-anchors>
</domain-config>
</network-security-config>
<!-- AndroidManifest.xml 中引用 -->
<application
android:networkSecurityConfig="@xml/network_security_config"
... >
六、WebSocket 通信
val request = Request.Builder()
.url("wss://echo.websocket.org")
.build()
val listener = object : WebSocketListener() {
override fun onMessage(webSocket: WebSocket, text: String) {
// 接收消息
}
override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
// 连接关闭
}
}
val webSocket = client.newWebSocket(request, listener)
// 发送消息
webSocket.send("Hello WebSocket!")
七、性能优化
1. 连接池
val client = OkHttpClient.Builder()
.connectionPool(ConnectionPool(5, 5, TimeUnit.MINUTES))
.build()
2. 请求合并
// 使用GraphQL合并多个REST请求
// 或使用自定义拦截器合并相似请求
3. 图片加载优化
// 使用Glide或Picasso
Glide.with(context)
.load(imageUrl)
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.into(imageView)
八、调试工具
Stetho:Facebook开发的Android调试工具
val client = OkHttpClient.Builder() .addNetworkInterceptor(StethoInterceptor()) .build()
Chrome DevTools:查看网络请求
Charles/Fiddler:抓包工具
九、最佳实践
- 主线程规则:网络请求必须在后台线程执行
- 错误处理:妥善处理各种网络异常(超时、无网络等)
- 资源释放:确保关闭所有网络资源(InputStream等)
- 性能考虑:
- 减少请求次数
- 压缩数据
- 使用缓存
- 安全考虑:
- 使用HTTPS
- 验证服务器证书
- 敏感数据加密
Android网络开发需要综合考虑功能实现、性能优化和安全性,选择合适的工具和架构可以使网络层更加健壮和高效。