【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
文章目录
- webView
- 使用步骤
- 示例
- HttpURLConnection
- 使用步骤
- 示例
- GET请求
- POST请求
- okHttp
- 使用步骤
- 1. 添加依赖
- 2. 创建OkHttpClient实例
- 3. 创建Request对象构建请求
- 4. 发送请求
- 5. 获取响应
- Pull解析方式
- 1. 准备XML数据
- 2. 创建数据类
- 3. 使用Pull解析器解析XML
webView
WebView
是 Android 中用于显示网页内容的组件。它允许你在应用内嵌入一个浏览器,加载并显示 HTML、JavaScript、CSS 等网页内容。以下是使用WebView
的步骤和一些示例代码。
使用步骤
-
在布局文件中添加
WebView
:- 在 XML 布局文件中定义一个
WebView
控件。
- 在 XML 布局文件中定义一个
-
在 Activity 或 Fragment 中初始化
WebView
:- 获取布局中的
WebView
实例,并配置其设置。
- 获取布局中的
-
加载网页内容:
- 使用
loadUrl()
方法加载网页 URL,或使用loadData()
方法加载 HTML 字符串。
- 使用
-
配置设置(可选):
- 配置 JavaScript 支持、缓存设置等。
-
处理
WebView
的事件(可选):- 设置
WebViewClient
和WebChromeClient
来处理网页加载过程中的事件和 JavaScript 对话框。
- 设置
-
权限
在
AndroidManifest.xml
中添加互联网权限:
<uses-permission android:name="android.permission.INTERNET"/>
示例
- 布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><WebViewandroid:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent" />
</RelativeLayout>
- 在 Activity 中使用
WebView
在 MainActivity.java
中初始化并使用 WebView
:
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private WebView webView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);webView = findViewById(R.id.webview);// 启用 JavaScript 支持webView.getSettings().setJavaScriptEnabled(true);// 设置 WebViewClient 以处理网页加载事件webView.setWebViewClient(new WebViewClient());// 加载网页内容webView.loadUrl("https://www.baidu.com");}
}
配置 WebView 设置
-
JavaScript 支持:启用 JavaScript 支持以处理动态网页内容。
webView.getSettings().setJavaScriptEnabled(true);
-
缓存设置:可以设置缓存模式来优化加载速度。
webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
-
自定义用户代理:可以设置用户代理字符串。
webView.getSettings().setUserAgentString("Custom User Agent");
处理 WebView 事件
WebViewClient
:用于处理网页加载过程中的事件。onPageStarted(WebView view, String url, Bitmap favicon)
:当页面开始加载时调用。onPageFinished(WebView view, String url)
:当页面加载完成时调用。shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
:处理 URL 跳转请求。
权限
在 AndroidManifest.xml
中添加互联网权限:
<uses-permission android:name="android.permission.INTERNET"/>
HttpURLConnection
HttpURLConnection
是 Android 中用于处理 HTTP 请求的类。它提供了一种在应用中发送和接收 HTTP 请求和响应的方法。
使用步骤
1. 创建 URL
对象:
- 使用指定的 URL 创建
URL
对象。
2. 打开连接:
- 使用
URL.openConnection()
打开连接,并将其转换为HttpURLConnection
。
3. 配置连接参数:
- 设置请求方法(如 GET 或 POST)。
- 配置连接和读取超时时间等参数。
4. 发送请求:
- 获取输入流并读取服务器响应。
5. 处理响应:
- 读取输入流中的数据,并进行处理。
6. 关闭连接:
- 关闭输入流和断开连接。
// 创建一个URL对象,指定请求的URL地址
URL url = new URL("http://www.baidu.com");
// 打开一个到该URL的HTTP连接,并将其转换为HttpURLConnection
HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 设置请求方法为GET
connection.setRequestMethod("GET");
// 设置连接超时时间为8秒
connection.setConnectTimeout(8000);
// 设置读取超时时间为8秒
connection.setReadTimeout(8000);// 获取服务器响应的输入流
InputStream inputStream = connection.getInputStream();
// 字节流->字符流->字符缓冲流
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {sb.append(line);
}
return sb.toString();
// 断开与服务器的连接
connection.disconnect();
示例
获取百度网页源码
Android 9.0(API level 28)及更高版本中,对所有的网络请求必须使用HTTPS
public class MainActivity extends AppCompatActivity implements View.OnClickListener {// 显示服务器响应的文本视图private TextView tv;// 发送请求的按钮private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = findViewById(R.id.btn_send);tv = findViewById(R.id.tv_response);button.setOnClickListener(this);}@Overridepublic void onClick(View v) {// 在新线程中执行网络请求new Thread(new Runnable() {@Overridepublic void run() {// 初始化HTTP连接和读取器HttpURLConnection connection = null;BufferedReader reader = null;try {// 创建URL对象,指定请求的URLURL url = new URL("https://www.baidu.com");// 打开连接connection = (HttpURLConnection) url.openConnection();// 设置请求方法为GETconnection.setRequestMethod("GET");// 设置连接超时和读取超时时间connection.setConnectTimeout(8000);connection.setReadTimeout(8000);// 获取输入流,用于读取服务器响应InputStream inputStream = connection.getInputStream();// 将输入流包装为缓冲读取器reader = new BufferedReader(new InputStreamReader(inputStream));StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null) {sb.append(line);}// 在UI线程中更新界面showResponse(sb.toString());} catch (IOException e) {throw new RuntimeException(e);} finally {if (reader != null) {try {reader.close();} catch (IOException e) {throw new RuntimeException(e);}}if (connection != null)connection.disconnect();}}}).start();}// 在UI线程中更新响应文本private void showResponse(final String string) {runOnUiThread(new Runnable() {@Overridepublic void run() {tv.setText(string);}});}
}
申请权限
<uses-permission android:name="android.permission.INTERNET"/>
GET请求
主要目的:从服务端获取符合条件的数据。
POST请求
主要目的:向服务端提交数据。
场景举例:用户注册的时候,填写表格里一堆的信息(姓名、性别、年龄、电话…),这些都是要提交给服务端的数据
表单
okHttp
使用步骤
1. 添加依赖
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
2. 创建OkHttpClient实例
OkHttpClient client = new OkHttpClient();
这是进行网络请求的客户端,配置了连接池、超时设置等参数。
3. 创建Request对象构建请求
Request request = new Request.Builder().url("https://www.baidu.com").build();
使用 Request.Builder
来构建 HTTP 请求,包括设置 URL 和请求方法(GET、POST 等)。
4. 发送请求
调用execute
方法发送请求并获取服务器返回数据
Response response = client.newCall(request).execute();
newCall(request).execute()
会同步地执行请求,并返回一个 Response
对象。异步执行可以使用 enqueue
方法。
5. 获取响应
final String responseData = response.body().string();
从 Response
对象中获取响应体,并将其转为字符串。响应体只能读取一次,所以多次使用它,可能需要将其保存到其他地方。
更新 UI:
runOnUiThread(new Runnable() {@Overridepublic void run() {tv.setText(responseData);}
});
由于网络请求是在子线程中执行的,任何更新 UI 的操作都必须在主线程中进行。使用 runOnUiThread
来确保 UI 更新在主线程中执行。
示例
public class MainActivity extends AppCompatActivity implements View.OnClickListener {private TextView tv; private Button button; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); button = findViewById(R.id.btn_send);tv = findViewById(R.id.tv_response);button.setOnClickListener(this);}@Overridepublic void onClick(View v) {// 在子线程中进行网络请求new Thread(new Runnable() {@Overridepublic void run() {// 创建 OkHttpClient 实例OkHttpClient client = new OkHttpClient();// 构建一个 GET 请求,指定请求的 URLRequest request = new Request.Builder().url("https://www.baidu.com").build();try {// 执行网络请求,并获取响应Response response = client.newCall(request).execute();// 获取响应体的字符串形式final String responseData = response.body().string();// 使用 runOnUiThread() 确保 UI 更新在主线程中进行runOnUiThread(new Runnable() {@Overridepublic void run() {// 更新 TextView 的内容为网络请求的响应数据tv.setText(responseData);}});} catch (IOException e) {// 捕获并打印可能发生的 IOExceptione.printStackTrace();}}}).start(); // 启动子线程进行网络请求}
}
Pull解析方式
Pull解析器是一种基于事件的解析方式,当解析器读取到XML文档中的开始标签、结束标签或文本内容时,会触发相应的事件。它是Android中处理XML的推荐方法之一,因其速度快且内存占用低。
1. 准备XML数据
假设我们有如下的XML数据:
<users><user><name>John Doe</name><age>30</age><married>true</married></user><user><name>Jane Doe</name><age>25</age><married>false</married></user>
</users>
2. 创建数据类
我们需要创建一个数据类来表示解析后的数据:
public class User {private String name;private int age;private boolean married;// ...
}
3. 使用Pull解析器解析XML
在Activity或Fragment中使用Pull解析器解析XML数据:
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// XML字符串String xmlData = "<users><user><name>John Doe</name><age>30</age><married>true</married></user><user><name>Jane Doe</name><age>25</age><married>false</married></user></users>";try {// 解析XMLList<User> users = parseXML(xmlData);// 遍历解析得到的用户列表并打印日志for (User user : users) {Log.d("MainActivity", "User Name: " + user.getName());Log.d("MainActivity", "User Age: " + user.getAge());Log.d("MainActivity", "User Married: " + user.isMarried());}} catch (XmlPullParserException | IOException e) {e.printStackTrace();}}// 解析XML数据private List<User> parseXML(String xmlData) throws XmlPullParserException, IOException {List<User> users = null; // 用于存储用户对象的列表User currentUser = null; // 当前正在解析的用户对象boolean insideUser = false; // 标记当前是否在<user>标签内// 创建XmlPullParserFactory和XmlPullParser实例XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser parser = factory.newPullParser();parser.setInput(new StringReader(xmlData)); // 设置解析器的输入为XML字符串int eventType = parser.getEventType(); // 获取事件类型while (eventType != XmlPullParser.END_DOCUMENT) { // 遍历整个文档String tagName;switch (eventType) {case XmlPullParser.START_DOCUMENT:users = new ArrayList<>(); // 初始化用户列表break;case XmlPullParser.START_TAG:tagName = parser.getName(); // 获取标签名if (tagName.equals("user")) { // 如果是<user>标签insideUser = true; // 标记进入<user>标签currentUser = new User(); // 创建一个新的User对象} else if (currentUser != null) {// 仅当在<user>标签内部时,才解析这些标签if (tagName.equals("name") && insideUser) {currentUser.setName(parser.nextText());} else if (tagName.equals("age") && insideUser) {currentUser.setAge(Integer.parseInt(parser.nextText()));} else if (tagName.equals("married") && insideUser) {currentUser.setMarried(Boolean.parseBoolean(parser.nextText()));}}break;case XmlPullParser.END_TAG:tagName = parser.getName(); // 获取结束标签的名称if (tagName.equals("user") && currentUser != null) {users.add(currentUser); // 将解析完毕的用户对象添加到列表中insideUser = false; // 标记离开<user>标签}break;}eventType = parser.next(); // 获取下一个事件}return users; // 返回解析得到的用户列表}
}
- 创建
XmlPullParserFactory
和XmlPullParser
实例。 - 设置解析器的输入为XML字符串。
- 使用
while
循环遍历整个XML文档,根据事件类型(开始标签、结束标签、文本等)进行相应处理。 - 在遇到
<user>
标签时,创建新的User
对象并开始填充数据。 - 在遇到
</user>
标签时,将填充完毕的User
对象添加到List<User>
中。 - 解析完成后,返回包含所有用户信息的列表。
感谢您的阅读
如有错误烦请指正
参考:
- 31.2-Android网络请求的Get与Post方法(1)_哔哩哔哩_bilibili
相关文章:

【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
文章目录 webView使用步骤示例 HttpURLConnection使用步骤示例GET请求POST请求 okHttp使用步骤1. 添加依赖2. 创建OkHttpClient实例3. 创建Request对象构建请求4. 发送请求5. 获取响应 Pull解析方式1. 准备XML数据2. 创建数据类3. 使用Pull解析器解析XML webView WebView 是 An…...

Kubernetes—k8s集群存储卷(pvc存储卷)
目录 一、PVC 和 PV 1.PV 2.PVC 3.StorageClass 4.PV和PVC的生命周期 二、实操 1.创建静态pv 1.配置nfs 2.创建pv 3.创建pvc 4.结合pod,将pv、pvc一起运行 2.创建动态pv 1.上传 2.创建 Service Account,用来管理 NFS Provisioner 在 k8s …...
用网格大师转换的3D Tiles数据,在进行了顶点重建后,尝试加载到Cesium中却无法显示内容。应该如何解决这一问题?
答: 建议首先尝试使用DasViewer来打开并检查这个3D Tiles的json文件。DasViewer能够迅速加载并显示3D Tiles数据,可以帮助快速验证数据是否完整且格式正确。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一,重叠区域处理…...

display:flex布局,最简单的案例
1. 左右贴边 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>#parent{width: 800px;background: red;height: 200px;display: flex;justify-content: space-between…...

SQL注入实例(sqli-labs/less-17)
0、初始网页 1、确定闭合字符 注入点在于password框,闭合字符为单引号 2、爆库名 1 and updatexml(1,concat(0x7e,database(),0x7e),1)# 1 and (select 1 from (select count(*),concat((select database()),floor(rand()*2))x from information_schema.tables gr…...

HTML+CSS+JS计算器
效果图 计算器功能详解 本计算器实现了多种功能,以下是所有功能的详细说明: 清空显示框 © 功能: 清除显示框中的所有内容。解释: 该功能用于重置计算器状态,清空当前输入的内容,使用户可以重新开始输入。 输入数字 (0-9) 功…...

EasyCVR视频汇聚平台云计算技术核心优势:高效、灵活与可扩展性深度解读
随着科技的飞速发展和社会的不断进步,视频监控已经成为现代社会治安防控、企业管理等场景安全管理中不可或缺的一部分。在这一背景下,EasyCVR视频汇聚平台凭借其强大的云计算技术,展现出了卓越的性能和广泛的应用前景。本文将深入解析EasyCVR…...

JavaScript高阶笔记总结(Xmind格式):第一天
Xmind鸟瞰图: 简单文字总结: js高阶知识总结: 理解Object: 1.返回一个由一个给定对象的自身可枚举属性组成的数组:Object.keys(对象名) 2.in 判断属性是否存在:"属性名" in 对象名 …...

十三、代理模式
文章目录 1 基本介绍2 案例2.1 Sortable 接口2.2 BubbleSort 类2.3 SortTimer 类2.4 Client 类2.5 Client 类的运行结果2.6 总结 3 各角色之间的关系3.1 角色3.1.1 Subject ( 主体 )3.1.2 RealObject ( 目标对象 )3.1.3 Proxy ( 代理 )3.1.4 Client ( 客户端 ) 3.2 类图 4 动态…...

Unity物理模块 之 2D效应器
本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 1.什么是效应器 2D 效应器 - Unity 手册 2D 效应器是与 2D 碰撞器一起使用的组件,相当于预先编写好的插…...

一款手机壳凭什么卖800元?Casetify品牌策略全解析 | 品牌出海
Casetify官网 巴黎奥运会,张怡宁的手机壳火了。 张怡宁在现场观战并使用手机的照片在网上流传,不是因为这位奥运前冠军,而是她的手机壳。这款满是「花花绿绿」图案的手机壳,迅速被网友发掘出是Casetify品牌的名为「炫彩花卉」的…...
【Rust光年纪】并发编程利器:探索 Rust 异步库与并行处理工具
构建高效异步应用:Rust 异步库详细解读 前言 在当今软件开发领域,Rust语言作为一种快速、安全和并发性能出色的编程语言,备受开发者青睐。随着Rust生态系统的不断扩大,越来越多的异步库和并行处理工具被引入到Rust开发中。本文将…...

机器学习第一课
1.背景 有监督学习:有标签(连续变量(回归问题:时间序列等)、分类变量(分类)) 无监督学习:没有标签(聚类、关联(相关性分析:哪些相关…...

C语言典型例题32
《C程序设计教程(第四版)——谭浩强》 习题2.9 编程序用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和printf函数输出这两个字符。 (1)变量c1,c2应该定义为字符型或者整型吗&#x…...
第二十五天学习笔记2024.8.9
1、通过frp内网穿透共享数据库信息 [root1 ~]# mysql -p密码 mysql> create user li% identified by 1; mysql> create database test; mysql> grant all on test.* to li; [root1 ~]# tar -xf frp_0.33.0_linux_amd64.tar.gz [root1 ~]# cd frp_0.33.0_linux_a…...
sqlserver将一张表导出成txt
bcp zjwb_sb_20111122.dbo.ep_pb_groupvisitplace out c:/1.txt -n -U sa -P sa...

YOLOv8+DeepSort实现
目录 1,YOLOv8算法简介 2,DeepSort算法介绍 1. SORT目标追踪 3,实现流程 1.检测 2. 生成detections 3. 卡尔曼滤波预测 4.使用匈牙利算法将预测后的tracks和当前帧中的detections进行匹配 5. 卡尔曼滤波更新 4,代码实现 …...

「链表」链表原地算法合集:原地翻转|原地删除|原地取中|原地查重 / LeetCode 206|237|2095|287(C++)
概述 对于一张单向链表,我们总是使用双指针实现一些算法逻辑,这旨在用常量级别空间复杂度和线性时间复杂度来解决一些问题。 所谓原地算法,是指不使用额外空间的算法。 现在,我们利用双指针实现以下四种行为。 //Definition fo…...

【STM32】SPI通信和RTC实时时钟
个人主页~ SPI通信和RTC实时时钟 SPI通信一、简介二、硬件电路三、基本原理四、SPI时序1、时序基本单元2、时序 五、FLASH操作注意事项1、写入操作2、读取操作 六、SPI外设1、简介2、结构 七、传输方式1、主模式全双工连续传输2、非连续传输 RTC实时时钟一、Unix时间戳二、BKP1…...

DAMA学习笔记(十三)-大数据和数据科学
1.引言 大数据不仅指数据的量大,也指数据的种类多(结构化的和非结构化的,文档、文件、音频、视频、流数据等),以及数据产生的速度快。数据科学家是指从从数据中探究、研发预测模型、机器学习模型、规范性模型和分析方法…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...