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;最大的不同在…