Android 網絡開發核心知識點

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)

八、調試工具

  1. Stetho:Facebook開發的Android調試工具

    val client = OkHttpClient.Builder().addNetworkInterceptor(StethoInterceptor()).build()
    
  2. Chrome DevTools:查看網絡請求

  3. Charles/Fiddler:抓包工具

九、最佳實踐

  1. 主線程規則:網絡請求必須在后臺線程執行
  2. 錯誤處理:妥善處理各種網絡異常(超時、無網絡等)
  3. 資源釋放:確保關閉所有網絡資源(InputStream等)
  4. 性能考慮
    • 減少請求次數
    • 壓縮數據
    • 使用緩存
  5. 安全考慮
    • 使用HTTPS
    • 驗證服務器證書
    • 敏感數據加密

Android網絡開發需要綜合考慮功能實現、性能優化和安全性,選擇合適的工具和架構可以使網絡層更加健壯和高效。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88292.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DVWA靶場通關筆記-弱會話IDs(Weak Session IDs Medium級別)

目錄 一、Session ID 二、代碼審計&#xff08;Medium級別&#xff09; 1、配置security為Medium級別 2、源碼分析 &#xff08;1&#xff09;index.php &#xff08;2&#xff09;Medium.php &#xff08;3&#xff09;對比分析 &#xff08;4&#xff09;滲透思路 三…

編輯器Vim的快速入門

如大家所了解的&#xff0c;Vim是一個很古老的編輯器&#xff0c;但是并沒有隨著時間的流逝消失在編輯器/IDE 的競爭中&#xff0c;Vim 獨創的模式機制和 hjkl 移動光標方式使得使用者在編輯文件時可以雙手不離開鍵盤&#xff0c;極大地提升了工作效率。由于 Vim 學習曲線極為陡…

深度學習核心:從基礎到前沿的全面解析

&#x1f9e0; 深度學習核心&#xff1a;從基礎到前沿的全面解析 &#x1f680; 探索深度學習的核心技術棧&#xff0c;從神經網絡基礎到最新的Transformer架構 &#x1f4cb; 目錄 &#x1f52c; 神經網絡基礎&#xff1a;從感知機到多層網絡&#x1f5bc;? 卷積神經網絡&am…

MySQL索引:數據庫的超級目錄

MySQL索引&#xff1a;數據庫的「超級目錄」 想象你有一本1000頁的百科全書&#xff0c;要快速找到某個知識點&#xff08;如“光合作用”&#xff09;&#xff1a; ? 無索引&#xff1a;逐頁翻找 → 全表掃描&#xff08;慢&#xff01;&#xff09;? 有索引&#xff1a;直接…

景觀橋 涵洞 城門等遮擋物對汽車安全性的影響數學建模和計算方法,需要收集那些數據

對高速公路景觀橋影響行車視距的安全問題進行數學建模&#xff0c;需要將物理幾何、動力學、概率統計和交通流理論結合起來。以下是分步驟的建模思路和關鍵模型&#xff1a;一、 核心建模目標 量化視距&#xff08;Sight Distance, SD&#xff09;&#xff1a;計算實際可用視距…

Git 用戶名和郵箱配置指南:全局與項目級設置

查看全局配置 git config --global user.name # 查看全局name配置 git config --global user.email # 查看全局email配置 git config --global --list # 查看所有全局配置查看當前項目配置 git config user.name # 查看當前項目name配置 git config user.email # 查看當前項目…

視頻序列和射頻信號多模態融合算法Fusion-Vital解讀

視頻序列和射頻信號多模態融合算法Fusion-Vital解讀概述模型整體流程視頻幀時間差分歸一化TSM模塊視頻序列特征融合模塊跨模態特征融合模塊概述 最近看了Fusion-Vital的視頻-射頻&#xff08;RGB-RF&#xff09;融合Transformer模型。記錄一下&#xff0c;對于實際項目中的多模…

frp內網穿透下創建FTP(解決FTP“服務器回應不可路由的地址。使用服務器地址替代”錯誤)

使用寶塔面板&#xff0c;點擊FTP&#xff0c;下載Pure-FTPd插件 點擊Pure-FTPd插件&#xff0c;修改配置文件&#xff0c;找到PassivePortRange, 修改ftp被動端口范圍為39000 39003&#xff0c;我們只需要4個被動端口即可&#xff0c;多了不好在內網穿透frp的配置文件中增加…

STM32控制四自由度機械臂(SG90舵機)(硬件篇)(簡單易復刻)

1.前期硬件準備 2s鋰電池一個&#xff08;用于供電&#xff09;&#xff0c;stm32f103c8t6最小系統板一個&#xff08;主控板&#xff09;&#xff0c;兩個搖桿&#xff08;用于搖桿模式&#xff09;&#xff0c;四個電位器&#xff08;用于示教器模式&#xff09;&#xff0c…

華為OD機試_2025 B卷_最差產品獎(Python,100分)(附詳細解題思路)

題目描述 A公司準備對他下面的N個產品評選最差獎&#xff0c; 評選的方式是首先對每個產品進行評分&#xff0c;然后根據評分區間計算相鄰幾個產品中最差的產品。 評選的標準是依次找到從當前產品開始前M個產品中最差的產品&#xff0c;請給出最差產品的評分序列。 輸入描述 第…

飛算JavaAI:重塑Java開發效率的智能引擎

飛算JavaAI:重塑Java開發效率的智能引擎 一、飛算JavaAI核心價值 飛算JavaAI是全球首款專注Java語言的智能開發助手,由飛算數智科技(深圳)有限公司研發。它通過AI大模型技術實現: 全流程自動化:從需求分析→軟件設計→代碼生成一氣呵成工程級代碼輸出:生成包含配置類、…

Java和Go各方面對比:現代編程語言的深度分析

Java和Go各方面對比&#xff1a;現代編程語言的深度分析 引言 在當今的軟件開發領域&#xff0c;選擇合適的編程語言對項目的成功至關重要。Java作為一門成熟的面向對象語言&#xff0c;已經在企業級開發中占據主導地位超過25年。而Go&#xff08;Golang&#xff09;作為Google…

CloudCanal:一款企業級實時數據同步、遷移工具

CloudCanal 是一款可視化的數據同步、遷移工具&#xff0c;可以幫助企業構建高質量數據管道&#xff0c;具備實時高效、精確互聯、穩定可拓展、一站式、混合部署、復雜數據轉換等優點。 應用場景 CloudCanal 可以幫助企業實現以下數據應用場景&#xff1a; 數據同步&#xff…

如何發現 Redis 中的 BigKey?

如何發現 Redis 中的 BigKey&#xff1f; Redis 因其出色的性能&#xff0c;常被用作緩存、消息隊列和會話存儲。然而&#xff0c;在 Redis 的使用過程中&#xff0c;BigKey 是一個不容忽視的問題。BigKey 指的是存儲了大量數據或包含大量成員的鍵。它們不僅會占用大量內存&…

Golang讀取ZIP壓縮包并顯示Gin靜態html網站

Golang讀取ZIP壓縮包并顯示Gin靜態html網站Golang讀取ZIP壓縮包并顯示Gin靜態html網站1. 讀取ZIP壓縮包2. 解壓并保存靜態文件3. 設置Gin靜態文件服務基本靜態文件服務使用StaticFS更精細控制單個靜態文件服務4. 完整實現示例5. 高級優化內存映射優化使用Gin-Static中間件6. 部…

參數列表分類法:基本參數與擴展參數的設計模式

摘要 本文提出了我設計的一種新的函數參數設計范式——參數列表分類法&#xff0c;將傳統的"單一參數列表"擴展為"多參數列表協同"模式。通過引入"基本參數列表"和"擴展參數列表"的概念&#xff0c;為復雜對象構建提供了更靈活、更具表…

Ajax之核心語法詳解

Ajax之核心語法詳解一、Ajax的核心原理與優勢1.1 什么是Ajax&#xff1f;1.2 Ajax的優勢二、XMLHttpRequest&#xff1a;Ajax的核心對象2.1 XHR的基本使用流程2.2 核心屬性與事件解析2.2.1 readyState&#xff1a;請求狀態2.2.2 status&#xff1a;HTTP狀態碼2.2.3 響應數據屬性…

ArcGIS 打開 nc 降雨量文件

1. 打開ArcToolbox&#xff0c;依次打開 多維工具 → 創建 NetCDF 柵格圖層&#xff0c;將 nc 文件拖入 輸入 NetCDF 文件輸入框&#xff0c;確認 X維度&#xff08;經度&#xff09;、Y維度&#xff08;經度&#xff09; 的變量名是否正確&#xff0c;點擊 確定。圖 1 加載nc文…

01-elasticsearch-搭個簡單的window服務-ik分詞器-簡單使用

1、elasticsearch下載地址 如果是其他版本可以嘗試修改鏈接中的版本信息下載 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-windows-x86_64.zip 2、ik分詞器下載地址 ik分詞器下載的所有版本地址&#xff1a;Index of: analysis-ik/stable/…

[數據結構與算法] 優先隊列 | 最小堆 C++

下面是關于 C 中 std::priority_queue 的詳細說明&#xff0c;包括初始化、用法和常見的應用場景。什么是 priority_queue&#xff1f; priority_queue&#xff08;優先隊列&#xff09;是 C 標準庫中的一個容器適配器。它和普通隊列&#xff08;queue&#xff09;最大的不同在…