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.inputStreamval 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) // 10MBval 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 中引用 -->
<applicationandroid: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網絡開發需要綜合考慮功能實現、性能優化和安全性,選擇合適的工具和架構可以使網絡層更加健壯和高效。