Android 网络传输数据之解析XML格式数据(Pull&SAX),一线互联网架构师360°全方面性能调优

e.printStackTrace();

}

}

}

创建request对象发送请求,通过url()方法来设置目标网络地址,这里将HTTP请求的地址改成 http://10.0.0.2:8023/get_data.xml, 10.0.0.2对于模拟器来说就是电脑本机的IP地址。调用OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器数据。得到服务器返回的数据之后,调用parseXMLWithPull()方法来解析服务器返回的数据。

在parseXMLWithPull()中,首先获取一个XmlPullParserFactory的实例,并借助该实例得到XmlPullParser对象,然后调用XmlPullParser的setInput()方法将服务器返回的XML数据设置进去。之后开始解析,通过getEvenType()可以得到当前的解析事件,然后在一个while循环中不断的进行地解析,如果当前的解析事件不等于XmlPullParser.END_DOCUMENT,说明解析工作还没完成,调用next()方法后可以获取下个解析事件。

在while循环中,通过getName()方法得到当前节点的名字,如果发现节点等于id、name或version,就调用nextText()方法来获取节点内具体的内容,每当解析完一个app节点后就获取到的内容就打印出现。

点击send Request按钮

在Logcat中打印的日志如下,可以看到已经将XML数据中的制定内容成功解析出来了。

在这里插入图片描述

SAX解析方式

相对于Pull解析要复杂一些,但是在语义上更容易理解。

在上面的程序进行修改即可,新建一个ContentHandlder类并继承自DefaultHandler,重写父类的5个方法

public class ContentHandler extends DefaultHandler {

private String nodeName;

private StringBuilder id;

private StringBuilder name;

private StringBuilder version;

@Override

public void startDocument() throws SAXException {

id = new StringBuilder();

name = new StringBuilder();

version = new StringBuilder();

}

@Override

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

nodeName = localName;

}

@Override

public void characters(char[] ch, int start, int length) throws SAXException {

if(“id”.equals(nodeName)){

id.append(ch,start,length);

}else if(“name”.equals(nodeName)){

name.append(ch,start,length);

}else if(“version”.equals((nodeName))){

version.append(ch,start,length);

}

}

@Override

public void endElement(String uri, String localName, String qName) throws SAXException {

if(“app”.equals(localName)){

Log.d(“ContentHandle”,"id is "+id.toString().trim());

Log.d(“ContentHandle”,"name is "+name.toString().trim());

Log.d(“ContentHandle”,"version is "+version.toString().trim());

//最后要将StringBuilder清空掉

id.setLength(0);

name.setLength(0);

version.setLength(0);

}

}

@Override

public void endDocument() throws SAXException {

super.endDocument();

}

}

startDocument()方法会在开始XML解析的时候调用,startElement()方法会在开始解析某个节点的时候调用,characters()方法会在获取节点中内容时调用,endElement()方法会在完成解析某个节点的时候调用,endDocument()方法会在完成整个XML解析的时候调用。

首先给id、name、version节点分别定义了一个StringBuilder对象,并在startDocument()方法中对它们进行初始化。在开始解析某个节点的时候会调用startElement()方法(localName参数记录当前节点的名字),在解析节点的具体内容时会调用characters()方法,我们会根据当前的节点名进行判断,将解析的内容添加到StringBuilder对象中,最后在endElement()方法中进行判断,如果app节点已经完成解析,就打印内容并在打印完成后清空StringBuilder。

修改MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

TextView responseText;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button sendRequest = (Button) findViewById(R.id.send_request);

responseText = (TextView) findViewById(R.id.response_text);

sendRequest.setOnClickListener(this);

}

@Override

public void onClick(View v) {

if(v.getId() == R.id.send_request){

sendRequestWithOkHttp();

}

}

private void sendRequestWithOkHttp(){

//开启线程来发起网络请求

new Thread(new Runnable() {

@Override

public void run() {

try{

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()

.url(“http://10.0.2.2:8023/get_data.xml”)

.build();

Response response = client.newCall(request).execute();

String responseData = response.body().string();

paraseXMLWithSAX(responseData);

}catch (Exception e){

e.printStackTrace();

}

}

}).start();

}

private void paraseXMLWithSAX(String xmlData){

try{

SAXParserFactory factory = SAXParserFactory.newInstance();

XMLReader xmlReader = factory.newSAXParser().getXMLReader();

ContentHandler handler = new ContentHandler();

//将ContentHandler的实例设置到XMLReader中

xmlReader.setContentHandler(handler);

//开始执行解析

xmlReader.parse(new InputSource(new StringReader(xmlData)));

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)
img

最后

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

选定你想去的几家公司后,先去一些小的公司练练,学习下面试技巧,总结下,也算是熟悉下面试氛围,平时和同事或者产品PK时可以讲得头头是道,思路清晰至极,到了现场真的不一样,怎么描述你所做的一切,这绝对是个学术性问题!

面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

择他了。

金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-LX39jXF3-1711544674727)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值