- 浏览: 637382 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
luo_ganlin:
别的不多说,点个赞!
关于Android隐式启动Activity -
IWSo:
谢楼主!研究了好久,原来是这样!
android中如何让LinearLayout实现点击时背景图片切换 -
fantao005x:
粘帖的不错
android中如何让listview的内容全部显示出来 -
learner576539763:
Android_gqs 写道请问博主,Viewstub 可实现 ...
android中ViewStub使用 -
goontosoon:
抄的什么啊,狗屁不通
对ContentProvider中getType(Uri uri)
好久没写过博文了,最近在做xml方面的解析,xml的解析一直都是比较繁琐的,所以对android的 pull进行了简单的封装,不用再为每个xml都创建解析类,但目前只实现了对xml的简单实现,主要通过反射来实现
能解析的xml形式主要有如下几种,复杂的暂未支持
<?xml version="1.0" encoding="UTF-8"?> <list> <user id="1"> <userName>张三</userName> <email>zhangsan@xxx.com</email> </user> <user> <id>2</id> <userName>李四</userName> <email>lisi@xxx.com</email> </user> <user> <id>3</id> <userName>王五</userName> <email>wangwu@xxx.com</email> </user> </list>
对应的java类如下:
public class User { private int id; private String userName; private String email; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
支持简单的对象解析
<?xml version="1.0" encoding="UTF-8"?> <menu> <id>1</id> <code>1002</code> <name>测试</name> </menu>
或者
<?xml version="1.0" encoding="UTF-8"?> <menu id="1" code="1002"> <name>测试</name> </menu>
对应的java类如下:
public class Menu { private int id; private int code; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
支持对象中有list列表的解析
<?xml version="1.0" encoding="UTF-8"?> <parent> <total>33</total> <list> <user> <id>1</id> <userName>张三</userName> <email>zhangsan@xxx.com</email> </user> <user id="2"> <userName>李四</userName> <email>lisi@xxx.com</email> </user> <user id="3" userName="王五"> <email>wangwu@xxx.com</email> </user> </list> </parent>
对应的java类如下:
import java.util.List; public class UserList { private int total; private List<User> user; public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public List<User> getUser() { return user; } public void setUser(List<User> user) { this.user = user; } }
xml解析器代码如下:
import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import android.util.Log; import android.util.Xml; /** * 对pull解析xml进行了封装,不用给每个xml,再创建一个解析类 * * @author steven * * http://www.juziku.com/sunlightcs/ * */ public class XmlParse { /** * 解析XML * @param is xml字节流 * @param clazz 字节码 如:Object.class * @param startName 开始位置 * @return 返回List列表 */ @SuppressWarnings({ "rawtypes", "unchecked" }) public List getXmlList(InputStream is, Class<?> clazz, String startName) { List list = null; XmlPullParser parser = Xml.newPullParser(); Object object = null; try { parser.setInput(is, "UTF-8"); //事件类型 int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: list = new ArrayList<Object>(); break; case XmlPullParser.START_TAG: //获得当前节点元素的名称 String name = parser.getName(); if (startName.equals(name)) { object = clazz.newInstance(); //判断标签里是否有属性,如果有,则全部解析出来 int count = parser.getAttributeCount(); for(int i=0; i<count; i++) setXmlValue(object, parser.getAttributeName(i), parser.getAttributeValue(i)); } else if (object != null) { setXmlValue(object, name, parser.nextText()); } break; case XmlPullParser.END_TAG: if (startName.equals(parser.getName())) { list.add(object); object = null; } break; } eventType = parser.next(); } } catch (Exception e) { Log.e("xml pull error", e.toString()); } return list; } /** * 解析XML * @param is xml字节流 * @param clazz 字节码 如:Object.class * @return 返回Object */ @SuppressWarnings({ "unchecked", "rawtypes" }) public Object getXmlObject(InputStream is, Class<?> clazz) { XmlPullParser parser = Xml.newPullParser(); Object object = null; List list = null; Object subObject = null; String subName = null; try { parser.setInput(is, "UTF-8"); //事件类型 int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: object = clazz.newInstance(); break; case XmlPullParser.START_TAG: //获得当前节点元素的名称 String name = parser.getName(); Field[] f = null; if(subObject == null){ f = object.getClass().getDeclaredFields(); //判断标签里是否有属性,如果有,则全部解析出来 int count = parser.getAttributeCount(); for(int j=0; j<count; j++) setXmlValue(object, parser.getAttributeName(j), parser.getAttributeValue(j)); }else{ f = subObject.getClass().getDeclaredFields(); } for(int i = 0; i < f.length; i++){ if(f[i].getName().equalsIgnoreCase(name)){ //判断是不是List类型 if(f[i].getType().getName().equals("java.util.List")){ Type type = f[i].getGenericType(); if (type instanceof ParameterizedType) { //获得泛型参数的实际类型 Class<?> subClazz = (Class<?>)((ParameterizedType)type).getActualTypeArguments()[0]; subObject = subClazz.newInstance(); subName = f[i].getName(); //判断标签里是否有属性,如果有,则全部解析出来 int count = parser.getAttributeCount(); for(int j=0; j<count; j++) setXmlValue(subObject, parser.getAttributeName(j), parser.getAttributeValue(j)); if(list == null){ list = new ArrayList<Object>(); f[i].setAccessible(true); f[i].set(object, list); } } }else{ //普通属性 if(subObject != null){ setXmlValue(subObject, name, parser.nextText()); }else{ setXmlValue(object, name, parser.nextText()); } } break; } } break; case XmlPullParser.END_TAG: if (subObject != null && subName.equalsIgnoreCase(parser.getName())) { list.add(subObject); subObject = null; subName = null; } break; } eventType = parser.next(); } } catch (Exception e) { Log.e("xml pull error", e.getMessage()); } return object; } /** * 把xml标签的值,转换成对象里属性的值 * @param t 对象 * @param name xml标签名 * @param value xml标签名对应的值 */ private void setXmlValue(Object t, String name, String value){ try { Field[] f = t.getClass().getDeclaredFields(); for(int i = 0; i < f.length; i++){ if(f[i].getName().equalsIgnoreCase(name)){ f[i].setAccessible(true); //获得属性类型 Class<?> fieldType = f[i].getType(); if(fieldType == String.class) { f[i].set(t, value); }else if(fieldType == Integer.TYPE) { f[i].set(t, Integer.parseInt(value)); }else if(fieldType == Float.TYPE) { f[i].set(t, Float.parseFloat(value)); }else if(fieldType == Double.TYPE) { f[i].set(t, Double.parseDouble(value)); }else if(fieldType == Long.TYPE) { f[i].set(t, Long.parseLong(value)); }else if(fieldType == Short.TYPE) { f[i].set(t, Short.parseShort(value)); }else if(fieldType == Boolean.TYPE) { f[i].set(t, Boolean.parseBoolean(value)); }else{ f[i].set(t, value); } } } } catch (Exception e) { Log.e("xml error", e.toString()); } } }
发表评论
-
EditText软键盘弹出问题解决
2013-02-26 23:10 1469当带有EditView的activity第一次进入时,第一 ... -
android中获取系统相关属性adb
2012-11-15 14:41 22011.查看系统相关属性可以通过: adb shell ... -
Android使用Intent传递复杂参数及复杂参数列表
2012-11-05 17:29 1637刚开始一直纠结于Intent只能put像int, ... -
解决P6200/P6800扩展卡第三方软件不可写的BUG
2012-11-05 17:01 1035从XDA看来的步骤:1. Using a root-e ... -
android 中跟actionbar相关的属性
2012-10-25 17:07 2485android:uiOptions 这个属性用于设置A ... -
source insight使用快捷键
2012-10-25 10:59 1560F5指定行号,实现行跳转,在遇到编译错误的时候,能特 ... -
android中推出应用比较有效率的方法
2012-10-11 16:57 1167添加一个全局变量作为程序退出的标记(boolean类型) ... -
declare-styleable的使用
2012-10-09 13:59 1179declare-styleable的使用 decl ... -
android程序安全的建议
2012-09-29 14:58 5314如果保证自己的 ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
2012-09-29 14:45 1080从 Java 5 开始,Java 提供了自己的线程池。线 ... -
android应用检测更新代码
2012-09-24 17:40 1852JAVA代码: UpdateManager.java ... -
adb命令详解
2012-09-19 15:04 2892Android adb的常用命令略解 Androi ... -
android中屏蔽其它系统按钮的dialog
2012-09-18 10:13 1655public class MyProgress ... -
如何给Scrollview里内容截屏并生成bitmap,注意:Scrollview里面内容较多有滚动了
2012-09-18 10:07 1649使用for循环递归累加其内部的子控件的高度: p ... -
wakelock的使用
2012-09-17 11:44 10088PowerManager.WakerLock是我分析St ... -
启动另外一个apk
2012-09-14 13:16 906这篇博文主要是获取其他apk程序的启动的主intent, ... -
android中全屏的方法
2012-09-14 13:04 9711.直接代码编写 @Override ... -
android:installLocation简析
2012-09-12 15:25 1124在Froyo(android 2.2,API Le ... -
外部apk启动启动另外一个apk
2012-09-06 17:54 1055public class TestingBroadc ... -
listview如何实现圆角
2012-09-05 17:32 1941首先呢,我们还是看几个示图:(这是360推出的一款天气预 ...
相关推荐
2. **创建解析器**: 使用`SAXParserFactory`创建`SAXParser`实例,然后通过`parse()`方法解析XML输入源。输入源可以是文件、流或者URL。 3. **事件处理**: 在解析过程中,SAX解析器会调用我们在`DefaultHandler`...
1. 在Android中,由于内存限制,对于大文件,使用SAX解析比DOM解析更有效率。 2. SAX解析是顺序的,因此解析过程中不能跳过任何元素。 3. 解析过程是线程安全的,可以在多个线程中同时解析不同的XML文件。 4. 在事件...
在JUnit测试中使用SAX解析XML,首先需要创建一个实现了`DefaultHandler`接口的类,重写相关事件处理方法,如`startElement()`、`endElement()`和`characters()`。然后,创建`SAXParser`并设置处理程序,最后调用`...
在处理大型XML文档时,SAX解析器比DOM(Document Object Model)更有效率,因为它不需要将整个文档加载到内存中。SAX解析器逐行读取XML文件,当遇到如开始元素、结束元素、文本等事件时,会触发相应的回调函数,这样...
这种方法不需要一次性加载整个文档,因此对大型XML文件更有效率。然而,由于不能直接访问文档结构,处理数据可能更复杂,需要在事件回调中保持状态。 XML Pull解析是另一种解析方式,结合了DOM和SAX的优点。它允许...
在Android开发中,SVG的使用可以提供高质量的图形,特别是在高分辨率设备上,比传统的位图(Bitmap)更具有优势。"安卓svg解析"主要涉及以下几个关键知识点: 1. **SVG的基本概念**:SVG是一种开放标准的矢量图形...
这种方式相比单播和广播更有效率,因为它只需要发送一次数据,就能被多个接收者同时接收,减少了网络带宽的消耗。 在这个示例中,开发者可以学习到如何在Android应用中创建和管理UDP套接字,设置组播地址和端口,...
在Android应用中进行串口通信首先需要在`AndroidManifest.xml`文件中添加相应的权限声明。例如,`<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />` 和 `<uses-feature android:name=...
Android UI设计是基于用户界面(UI)的理论,其主要目的是让用户能够方便有效率地操作硬件,完成与设备的双向互动。 用户界面(UI)定义广泛,它不仅包括人机互动,还包括图形用户界面。在人类与机械的信息交流中,...
为了避免这种情况,可以考虑结合使用LinearLayout或其他布局,或者使用ConstraintLayout,它在处理复杂布局时通常更有效率。 5. **在Android Studio中的使用**: - Android Studio提供了可视化编辑器来方便地设计...
以下是对这个"android RS232串口读写程序"的详细解析: 1. **RS232串口通信**: RS232是最早的标准串行接口之一,用于设备之间的通信。它定义了数据位、停止位、校验位、波特率等通信参数,并通过DB9或DB25连接器...
在Android应用开发中,安全是...Apktool和Dex2jar是这个过程中的核心工具,正确使用和更新这些工具,可以帮助开发者更有效地进行APK分析。在遇到反编译异常时,及时检查工具版本和错误日志,通常能找到解决问题的线索。
通过以上方法,开发者可以有效地避免和解决Android应用中的窗口抖动问题,提高用户体验和应用性能。在开发过程中,持续关注性能指标,如帧率(FPS)和主线程的CPU使用率,可以帮助及时发现和修复窗口抖动问题。
使用JUnit和Espresso进行单元测试和UI测试,使用Android Studio的调试工具进行问题排查,都是优化代码质量和提升开发效率的有效手段。 12. 性能优化 了解内存管理、CPU使用率、电量消耗和渲染性能等指标,通过...
深入研究这个源码,不仅可以帮助我们理解Android应用程序的开发流程,也能为设计更有效的英语学习工具提供启示。通过这样的实践,开发者能够提升自己的技能,同时为用户提供更高效、更具趣味性的学习体验。
本文将详细解析"Android串口通信Demo"的实现原理、关键步骤及注意事项,帮助开发者理解如何在Android应用中实现串口通信。 串口通信,也称为串行通信,是一种数据传输方式,通过串行数据线一次传输一个比特位。在...
"ComTest"这个程序应该是一个实现了这些功能的实例,通过它,你可以了解如何在Android设备上进行串口通信,实现与外部设备的有效交互。在实际开发中,可能还需要考虑线程管理、缓冲区大小、超时设置等高级话题,以...
相比XML或JSON等文本格式,Protobuf的二进制格式具有更小的体积,更快的解析速度,适合于实时传输大数据量的视频流。在本项目中,Android手机摄像头捕捉的视频数据被编码为Protobuf消息,然后发送到服务器。 **...
在Android开发中,ZBar是一个常用的库,用于处理条形码和二维码的扫描与解析。本文将详细探讨ZBar在Android中的应用,包括其工作原理、集成步骤、使用方法以及如何从相册读取图片进行解析。 首先,ZBar是一个开源的...
3. **权限管理**:在AndroidManifest.xml中添加必要的权限,如`<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />`,因为串口可能位于USB端口,需要位置权限。 4. **数据发送解析**:在...