首页 > 编程语言 >第9天:网络编程

第9天:网络编程

时间:2024-11-05 17:45:39浏览次数:5  
标签:请求 val 编程 网络 JSON import Android

第9天,我们将深入了解如何在Android应用中进行网络编程,涉及HTTP请求、JSON数据解析以及如何处理网络权限的具体步骤。

内容概述

本节学习内容代码链接为 NetworkExample

1. HTTP请求

Android提供了多种方法来执行HTTP请求,我们将重点关注以下几种:

  • HttpURLConnection:Android SDK中自带的类,适合执行简单的HTTP请求,操作相对底层。

  • OkHttp:一个功能强大且高效的HTTP客户端库。它不仅支持同步和异步请求,还提供连接池、GZIP压缩等特性,通常用于构建复杂的网络交互。

  • Retrofit:基于OkHttp构建的库,专注于RESTful API的实现。它简化了网络请求的代码,通过注解方式定义API,自动将JSON数据转换为对象,易于使用。

2. JSON数据解析

当我们从API获取数据时,通常会返回JSON格式的数据。为了在Android中处理JSON,我们可以使用以下方法:

  • JSONObject和JSONArray:Android原生提供的类,允许我们手动解析JSON数据,适合简单的数据结构。

  • Gson:一个流行的开源库,可以将JSON字符串快速转换为Kotlin对象。它支持复杂的对象嵌套和集合,使用方便。

3. 处理网络权限

在Android中,访问网络需要在AndroidManifest.xml文件中声明权限,以确保应用有权进行网络操作。我们需要添加以下权限:

<uses-permission android:name="android.permission.INTERNET"/>

工程创建过程

步骤1:创建新项目

  1. 打开Android Studio,点击“新建项目”。
  2. 选择“Empty Activity”模板,然后点击“下一步”。
  3. 填写项目详细信息
    • 项目名称:例如“NetworkExample”
    • 包名:例如“com.example.networkexample”
    • 保存位置:选择合适的目录
    • 语言:选择Kotlin
    • 最低API级别:可以选择API 21(Android 5.0)以兼容大部分设备。
  4. 点击“完成”创建项目,Android Studio将生成一个基本的应用结构。

步骤2:配置Gradle依赖

在项目的build.gradle(app级别)文件中添加所需的依赖项,以便使用OkHttp和Gson库。找到dependencies部分,并添加如下内容:

dependencies {
    implementation "com.squareup.okhttp3:okhttp:4.10.1"
    implementation "com.google.code.gson:gson:2.10.0"
}

完成后,点击“Sync Now”按钮,Gradle将下载并集成这些库。

步骤3:添加网络权限

AndroidManifest.xml中,确保添加了网络权限。找到<manifest>标签下的部分,并添加如下代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.networkexample">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.DayNight.DarkActionBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

实践实例

1. 获取网络数据

我们将从一个公共API获取数据,并解析JSON。此处我们将使用https://randomuser.me/api/,它提供随机用户信息。

代码实现

MainActivity.kt中,编写以下代码:

package com.example.networkexample

import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import okhttp3.*
import com.google.gson.Gson
import com.google.gson.JsonSyntaxException
import java.io.IOException

// 数据类
data class User(val name: Name)
data class Name(val first: String, val last: String)
data class ApiResponse(val results: List<User>)

class MainActivity : AppCompatActivity() {

private val client = OkHttpClient()
private val gson = Gson()
private lateinit var tvUserInfo: TextView // 用于显示用户信息的TextView

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

// 初始化TextView
tvUserInfo = findViewById(R.id.tv_user_info)

fetchRandomUser()
}

private fun fetchRandomUser() {
val request = Request.Builder()
.url("https://randomuser.me/api/")
.build()

client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Log.e("NetworkExample", "Error fetching user", e)
}

override fun onResponse(call: Call, response: Response) {
response.body?.let { responseBody ->
val jsonData = responseBody.string()
parseJson(jsonData)
}
}
})
}

private fun parseJson(jsonData: String) {
try {
val apiResponse = gson.fromJson(jsonData, ApiResponse::class.java)
val user = apiResponse.results[0]
val userInfo = "User: ${user.name.first} ${user.name.last}"

// 更新UI必须在主线程
runOnUiThread {
tvUserInfo.text = userInfo
}

Log.d("NetworkExample", userInfo)
} catch (e: JsonSyntaxException) {
Log.e("NetworkExample", "Error parsing JSON", e)
}
}
}

更新“”代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ll_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">

<!-- 用于显示用户信息的TextView -->
<TextView
android:id="@+id/tv_user_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fetching user data..."
android:textSize="18sp"
android:textStyle="bold" />

</LinearLayout>

2. 代码详解

  • 数据类

    • User:表示用户对象,包含一个Name属性。
    • Name:表示用户姓名,包含firstlast属性。
    • ApiResponse:表示API响应,包含一个results列表,存储多个用户。
  • OkHttpClient

    • 创建OkHttpClient实例,用于执行网络请求。
  • fetchRandomUser()

    • 该方法在子线程中执行网络请求,以避免在主线程中执行耗时操作。
    • 使用Request.Builder()构造请求,并调用client.newCall(request).execute()获取响应。
    • 将响应体转换为字符串,传递给parseJson方法处理。
  • parseJson()

    • 解析JSON数据,使用Gson库将JSON字符串转换为ApiResponse对象。
    • ApiResponse中提取用户信息并打印到日志中,以供调试。

3. 运行应用

  1. 连接设备或启动模拟器
  2. 点击运行按钮,查看Logcat输出,确认是否成功获取用户信息。

在Logcat中,你应该能看到类似以下的输出:

User: John Doe

如果你在Logcat中看到了用户信息,恭喜你!你已经成功完成了Android中的网络请求和JSON解析。

4. 注意事项

  • 确保在真实应用中使用异步网络请求,以免阻塞主线程。
  • 处理网络错误和异常是非常重要的,确保应用的稳定性。
  • 在处理网络请求时,可以考虑使用Coroutine来简化异步编程,提升代码可读性。

通过这一节的学习,你已经掌握了在Android中进行网络编程的基本技能,接下来可以尝试更复杂的网络交互和数据处理。

标签:请求,val,编程,网络,JSON,import,Android
From: https://blog.csdn.net/weixin_41644568/article/details/142915497

相关文章

  • springboot+vue沧交编程论坛的设计与实现 前8【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着互联网技术的迅猛发展,编程技术已成为现代社会不可或缺的一部分。作为技术交流与学习的平台,编程论坛扮演着至关重要的角色。然而,现有的编程论坛往往存在功能单一、用户体验不佳等问题,无法满足广大编程爱好者与从业者日益增长的需求......
  • Python编程风格:EAFP防御
    在Python编程的世界里,有一种非常重要的编程风格,称为“EAFP”(EasiertoAskforForgivenessthanPermission,意为“请求宽恕比请求许可更容易”)。这一风格与许多其他编程语言中的常见做法形成了鲜明对比。在这篇博文中,我们将深入探讨EAFP的概念,包括其历史背景、基本原则、在实......
  • 计算机网络性能
    五、计算机网络性能计算机网络性能(1)速率即数据率(datarate)或称数据传输速率或比特率(bitrate)单位时间(秒)传输信息(比特)量计算机网络中最重要的一个性能指标单位:b/s(orbps)、kb/s、Mb/s、Gb/sk=10的3次方、M=10的6次方、G=10的9次方速率往往是指额定速率或标称速......
  • 实验3 类和对象_基础编程2
    1.实验任务1button.hpp1#pragmaonce2#include<iostream>3#include<string>4usingstd::string;5usingstd::cout;6//按钮类7classButton{8public:9Button(conststring&text);10stringget_label()const;11......
  • java计算机毕业设计基于springboot的游戏交易网络无忧(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着游戏产业的迅猛发展,游戏交易市场日益庞大。然而,当前的游戏交易环境面临着诸多挑战。一方面,游戏交易涉及到众多参与者,包括普通用户和卖家用户......
  • 易基因:多组学分析揭示围产期IL-6动物模型肾脏发育过程中的DNA甲基化+基因表达调控网络
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因,慢性肾脏病(Chronickidneydisease,CKD)是全球发病率和死亡率的主要原因之一。母体肥胖与系统性炎症和促炎细胞因子白细胞介素-6(Interleukin-6,IL-6)水平升高有关。此前研究证明妊娠期间母体IL-6增加会影响小鼠的宫内发育......
  • 实验3 类和对象_基础编程2
    任务1button.hpp1#pragmaonce23#include<iostream>4#include<string>56usingstd::string;7usingstd::cout;89//按钮类10classButton{11public:12Button(conststring&text);13stringget_label()const;1......
  • 基于surging 的木舟平台如何通过HTTP网络组件接入设备
    一、概述     上篇文章介绍了木舟如何上传模块热部署,那么此篇文章将介绍如何利用HTTP网络组件接入设备,那么有些人会问木舟又是什么,是什么架构为基础,能做什么呢?      木舟(Kayak)是什么?      木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行......
  • 【洛谷 P3695 CYaRon!语】从一道大模拟入坑自制编程语言
    原题传送门本来是想投题解的,但是仔细阅读了一下主题库题解规范,发现这篇文章更加适合单独作为一篇blog阅读而非挂在题解区里污染环境,所以就这样了。0xff开始之前这道题我很早以前就开始看了,那时还只有星野梦美大佬的一篇题解。而到现在,我终于是有了时间和能力来切掉这道题,......
  • 程序员推荐的笔记本,2024年六款高性能笔记本电脑推荐!非常适合计算机专业,做编程设计的程
    文|二加一网络科技对于计算机相关专业,尤其是学习编程或程序员来说,选择一款高性能的笔记本电脑至关重要,它不仅能够提供流畅稳定的编程环境,还能助力高效地完成各项工作。接下来,小编就来推荐六款2024年非常适合编程的高性能笔记本电脑,看看哪一款能够成为你的得力助手。第......