Android学习之网络操作
网络操作
Android平台下的原生网络操作可以分为以下几步:
- 创建URL对象;
- 通过URL对象获取HttpURLConnection对象;
- 通过HttpURLConnection对象设置请求头键值对、网络连接超时时间等;
- 通过HttpURLConnection对象的connect()方法建立网络连接;
- 通过响应码判断请求是否成功,如果成功的话获取输入流,对返回的结果进行处理并显示;
这里要注意的是,网络请求操作不能直接放在ui线程中,需要另外开启一个线程去处理网络请求,因为网络请求操作是一个耗时的操作。
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><Buttonandroid:id="@+id/btn_sendget"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点击发送get请求"/><Buttonandroid:id="@+id/btn_sendpost"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点击发送post请求"/><TextViewandroid:id="@+id/tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:scrollbars="vertical"android:fadeScrollbars="false"/></LinearLayout>
GET请求
这里说一下用到的方法的作用:
setConnectTimeout:设置请求超时时间;
setRequestMethod:设置请求方法;
setRequestProperty:设置请求属性;
connect():建立网络连接;
getResponseCode():获取响应码;
try {new Thread(new Runnable() {@Overridepublic void run() {try {URL url = new URL("http://www.imooc.com/api/teacher?type=2&page=1");HttpURLConnection connection = (HttpURLConnection)url.openConnection();connection.setConnectTimeout(30*1000);connection.setRequestMethod("GET");connection.setRequestProperty("Content-Type","application/json");connection.setRequestProperty("Charset","UTF-8");connection.setRequestProperty("Accept-Charset","UTF-8");connection.connect();int responseCode = connection.getResponseCode();//如果请求成功if (responseCode == HttpURLConnection.HTTP_OK) {//获取输入流InputStream inputStream = connection.getInputStream();byte[] bytes = new byte[1024];StringBuffer result = new StringBuffer();int len = 0;while ((len = inputStream.read(bytes)) != -1) {result.append(new String(bytes,0,len));}//不能直接在其它线程更新ui线程,可以使用此方法或者使用handlerrunOnUiThread(new Runnable() {@Overridepublic void run() {tv.setText(result);}});Log.d(TAG, "onClick: " + result);}}catch (Exception e) {e.printStackTrace();}}}).start();} catch (Exception e) {e.printStackTrace();}
POST请求
new Thread(new Runnable() {@Overridepublic void run() {try {URL url = new URL("http://www.imooc.com/api/teacher?type=2&page=1");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(30 * 1000);connection.setRequestProperty("Content-Type","application/json");connection.setRequestProperty("Charset","UTF-8");connection.setRequestProperty("Accept-Charset","UTF-8");connection.connect();int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();int len = 0;byte[] bytes = new byte[1024];StringBuffer result = new StringBuffer();while ((len = inputStream.read(bytes)) != -1) {result.append(new String(bytes,0,len));}Log.d(TAG, "responseCode: " + responseCode);Log.d(TAG, "result: " + result);runOnUiThread(new Runnable() {@Overridepublic void run() {tv.setText(result);}});} else {Log.d(TAG, "responseCode: " + responseCode);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}).start();
解析返回的json数据
public List<Lesson> JsonToArray(String str) {List<Lesson> lessonList = new ArrayList<>();try {JSONObject jsonObject = new JSONObject(str);JSONArray jsonArray = jsonObject.getJSONArray("data");for (int i = 0; i < jsonArray.length(); i++) {JSONObject lesson = (JSONObject) jsonArray.get(i);int id = lesson.getInt("id");int learner = lesson.getInt("learner");String name = lesson.getString("name");String picSmall = lesson.getString("picSmall");String picBig = lesson.getString("picBig");String description = lesson.getString("description");Lesson lesson1 = new Lesson();lesson1.setId(id);lesson1.setDescription(description);lesson1.setLearner(learner);lesson1.setPicBig(picBig);lesson1.setPicSmall(picSmall);lesson1.setName(name);lessonList.add(lesson1);}} catch (JSONException e) {e.printStackTrace();}return lessonList;}
注意事项
Android9.0以后,使用http访问网络需要添加配置文件;首先在res目录下新建一个xml资源目录,然后创建配置文件,配置文件的名称必须是neteork_security_config.xml;
内容:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config><!--允许http请求的加载--><base-config cleartextTrafficPermitted = "true"/>
</network-security-config>
相关文章:
Android学习之网络操作
网络操作 Android平台下的原生网络操作可以分为以下几步: 创建URL对象;通过URL对象获取HttpURLConnection对象;通过HttpURLConnection对象设置请求头键值对、网络连接超时时间等;通过HttpURLConnection对象的connect()方法建立网…...
Delphi XE开发android开发环境搭建
Delphi xe为使用Delphi作为开发工具的程序员,提供了开发APP的便捷工具,它的开发环境也是非常容易搭建,这里我简述一下Android的开发环境搭建,Delphi XE开发Android程序的开发环境需要三个软件支持:Java SE Development开发环境、Android SDK和Android Ndk开发环境。 1、安…...
flink入门-流处理
入门需要掌握:从入门demo理解、flink 系统架构(看几个关键组件)、安装、使用flink的命令跑jar包flink的webUI 界面的监控、常见错误、调优 一、入门demo:统计单词个数 0、单词txt 文本内容(words.txt): hello world …...
【数据结构】单链表中,如何实现 将链表中所有结点的链接方向“原地”逆转
一.实现一个单链表(无头单向不循环) 我们首先实现一个无头单向不循环单链表。 写出基本的增删查改功能,以及其它的一些功能(可忽略)。 #include<stdio.h> #include<assert.h> #include<stdlib.h>…...
摘花生(简单DP)
Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。Hel…...
2022济南大学acm新生赛题解
通过答题情况的难度系数: 签到:A 简单:BL 中等:D 困难:CM 极难:KNO A-和 算出n个数的和判断正负性即可!!! 发现很多同学的代码错误:要么sum未赋初值&…...
策略模式教程
策略模式是一种行为型设计模式,它允许在运行时根据不同的情况选择不同的算法实现,从而使得算法可以独立于客户端而变化。本文将介绍策略模式的概念、应用场景、优点和缺点,并提供最佳的代码实践。本文的代码实现将使用Java语言,但…...
什么是刺猬理念
一、什么是刺猬理念刺猬理念是指把复杂的世界简化成单个有组织性的观点,一条基本原则或一个基本理念,发挥统帅和指导作用。核心是把事情简单化,把所有的挑战和进退维谷的局面压缩为简单的。二、刺猬理念的寓言故事狐狸是一种狡猾的动物&#…...
RPC通信相关
RPCRPC, 远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议,该协议允许运行于一台计算机的程序程调用另一台计算机的上的程序。通俗讲,RPC通过把网络通讯抽象为远程的过程调用,调用远程的过程就…...
Node.js + MongoDB 搭建博客 -- 登录页面
准备工作 安装Node.js安装express等相关库MongoDB数据库电脑系统:win11 功能分析 搭建一个简单的具有多人注册、登录、发表文章以及登出功能的博客。 设计目标 未登录:主页左侧导航栏显示home、login、register,右侧显示已发表的文章、发…...
互联网新理念,对于WEB 3.0 你怎么看?
WEB 3.0 这个名词走进大众视野已经有一段时间了,也曾在各个圈子里火热一时,至今各大互联网企业任旧在 WEB 3.0 上不断探索。但关于 WEB 3.0 是什么这个问题,其实大部分人都没有一个比较明确的认知,包括区块链和元宇宙等相关行业的…...
Git使用教程:最详细、最傻瓜、最浅显、真正手把手教
GITGIT版本控制版本控制的意义分布式图形化客户端环境搭建仓库的操作分支使用场景命令远程仓库操作生成公钥命令冲突忽略列表的配置时机配置方式版本回退练习:GIT 版本控制 把文件系统中的文件,按照修改的版本进行记录,进行管理的操作。 版…...
【面试题】Redis面试题汇总(无解答)
Redis为何这么快?缓存问题及解决入库和缓存策略问题及处理redis数据类型缓存过期删除策略内存淘汰机制Redis 回收进程如何工作的?Redis持久化RDB和AOFredis流式pipeline处理原生批命令 (mset, mget) 与 Pipeline 区别?Pipeline 有什么好处,为…...
RHCSA-用户和组管理和文件系统权限(3.11)
目录 用户(UID) 用户类别(UID): 用户的增删改查: 修改用户密码: 查看用户是否存在: 组(GID) 组的增删改查: 设置组密码: 用户…...
RK3588平台开发系列讲解(同步与互斥篇)信号量介绍
平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、信号量介绍二、信号量API1、结构体2、API三、函数调用流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢上一章我们看了自旋锁的原理,本章我们一起学习下信号量的用法。 一、信号量介绍 和自旋锁一样,…...
One-YOLOv5 v1.2.0发布:支持分类、检测、实例分割
One-YOLOv5 v1.2.0正式发布。完整更新列表请查看链接:https://github.com/Oneflow-Inc/one-yolov5/releases/tag/v1.2.0,欢迎体验新版本,期待你的反馈。 1 新版本特性 1. 同步了Ultralytics YOLOv5的上游分支v7.0,同时支持分类、目…...
Zookeeper的Java API操作
Zookeeper的Java API操作一、先启动Zookeeper集群二、IDEA 环境搭建三、创建子节点四、获取子节点并监听节点变化五、判断 Znode 是否存在六、Watcher工作流程一、先启动Zookeeper集群 二、IDEA 环境搭建 1.创建一个Maven工程:ZookeeperProject 2.在pom.xml文件添…...
Web3:前端知识和后端知识基础
三.Web3:前端知识和后端知识基础 1.了解前端开发 2.了解JSP 3.了解JAVAWeb的三大组件 4.Servlet的使用 5.Filter的使用 6.了解thymeleaf 未更新 三.Web3:前端知识和后端知识基础 1.了解前端开发 ①前端架构 HTML超文本标记语言CSS层叠样式表JavaS...
调试射频TX和rx实验工程出现的问题与反思
1.今天用ADS仿真 发现 加上SMA 插损就到了4db,但是直接用传输线就在1db以内 这个问题我目前想到的排查思路是换成IPEX, 换成IPEX插损就变成2db 拿最新的7626去看 看到上面是SMA-3G 小针 还是结合参考的demo PCB来看 2.用射频的ipex测试LNA 发现校准…...
代码随想录刷题-数组总结篇
文章目录数组二分查找原理习题题目1思路和代码题目-2移除元素习题我的想法暴力解法双指针有序数组的平方习题暴力排序双指针长度最小的子数组习题暴力解法滑动窗口螺旋矩阵 II习题我的解法别人的解法总结数组 二分查找 本节对应代码随想录中:代码随想录-二分查找 …...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
