2024年安卓最全Android 网络传输数据之解析XML格式数据(Pull&SAX),美团安卓面试

最后

答应大伙的备战金三银四,大厂面试真题来啦!

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:orientation=“vertical”

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

<Button

android:id=“@+id/send_request”

android:layout_height=“wrap_content”

android:layout_width=“match_parent”

android:text=“Send Request”/>

<ScrollView

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

<TextView

android:id=“@+id/response_text”

android:layout_width=“match_parent”

android:layout_height=“wrap_content” />

重点在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){

sendRequestWithOjHttp();

}

}

private void sendRequestWithOjHttp(){

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

new Thread(new Runnable() {

@Override

public void run() {

HttpURLConnection connection = null;

BufferedReader reader = null;

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();

paraseXMLWithPull(responseData);

}catch (Exception e){

e.printStackTrace();

}

}

}).start();

}

private void paraseXMLWithPull(String xmlData){

try{

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

XmlPullParser xmlPullParser = factory.newPullParser();

xmlPullParser.setInput(new StringReader(xmlData));

int evenType = xmlPullParser.getEventType();

String id=“”;

String name=“”;

String version=“”;

while(evenType != XmlPullParser.END_DOCUMENT){

String nodeName = xmlPullParser.getName();

switch(evenType){

//开始解析某个节点

case XmlPullParser.START_TAG:{

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

id = xmlPullParser.nextText();

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

name = xmlPullParser.nextText();

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

version = xmlPullParser.nextText();

}

break;

}

case XmlPullParser.END_TAG:{

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

Log.d(“MainActivity”,“id is”+id);

Log.d(“MainActivity”,“name is”+name);

Log.d(“MainActivity”,“version is”+version);

}

break;

}

default:

break;

}

evenType = xmlPullParser.next();

}

}catch (Exception e){

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());

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

下面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题全套解析,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,下面只是以图片的形式给大家展示一部分。

image

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

限,下面只是以图片的形式给大家展示一部分。

[外链图片转存中…(img-McPf7tYb-1715733684486)]

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

[外链图片转存中…(img-jCUJos6F-1715733684486)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值