1、Pull概述 Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建XML的 XmlSerializer,还提供了用来解析XML的Pull方式解析器...Pull方式创建XML,应用了标准xml构造器 org.xmlpull.v1.XmlSerializer来创建 XML ,org.xmlpull.v1.XmlPullParser来解析XML,需要导入以下内容...= new StringWriter(); Person []persons = new Person[3]; // 创建节点Person对象 persons[0] = new Person...// 方式二:使用工厂类XmlPullParserFactory的方式 XmlPullParserFactory factory = XmlPullParserFactory.newInstance...// XmlPullParser xpp = Xml.newPullParser(); // 方式二:使用工厂类XmlPullParserFactory的方式 XmlPullParserFactory
---- 对于Android来说pull解析xml类型的文件应该是非常简单的, 当然这是pull解析本身特性所决定的,那么接下来就跟随我的脚步来 看一看pull解析的小巧之处吧...习到pull解析技术,因为本api接口中的内容全部都是以xml解析的形式暴露 给大家的,该api中的一个国内新闻接口: 请点击文字进行跳转。...接下来就到了代码时刻,我会详细讲解为何要这么做。...xmlPullParserFactory = XmlPullParserFactory.newInstance(); XmlPullParser parser = xmlPullParserFactory.newPullParser...工程,获取其实例NewInstance 。
END_DOCUMENT:xml尾的事件类型,一般代码中首先判断是不是尾事件 START_TAG:开始节点的事件类型,这这里判断节点名字 END_TAG:结束节点的事件类型 TEXT:文本节点的事件类型...factory = XmlPullParserFactory.newInstance(); //XmlPullParser xmlPullParser = factory.newPullParser(...,在这里创建节点里的各个参数的bulid startElement:xml的某个节点,在定义个变量来记录当前节点的名字 characters:开始节点的事件类型,如果当前节点等于各个参数的话加入build...,但它并不是唯一的选择。...SAX解析也是一种特别常用 的 XML解析方式,虽然它的用法比 Pull解析要复杂一些,但在语义方面会更加的清楚。
/ */ //XML private void parseXMLWithPull(String xmlData) { try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance...之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后分发回Handler的handleMessage()方法中。...由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,于是我们在这里就可以安心地进行UI操作了。...第三个泛型参数指定为Boolean,则表示使用布尔型数据来反馈执行结果。...* 返回的数据会作为参数传递到此方法中,可以利用返回的数据来进行一些UI 操作, * 比如说提醒任务执行的结果,以及关闭掉进度条对话框等。
在 Java 语言中,static 关键字主要用于表明方法和属性是属于某个对象,而不是属于对象的实例。...接下来的内容会告诉大家在 Java 和 Kotlin 中实现单例的区别,以及在 Kotlin 中如何在不使用 static 关键字的情况下实现单例,(其实就是通过 object 关键字实现的),然后为大家详解使用...单例非常适合那些需要在应用的不同地方共享的对象,以及初始化实例非常消耗资源的场景下使用。 Java 中的单例 要保证一个类只有一个实例,您需要控制对象的创建方式。...对于这么一个简单的任务却使用了如此繁杂的代码,所以 Java 中创建单例时通常会使用 枚举。 Kotlin 中的单例 那么我们再来看看 Kotlin。...如果您创建类的时候使用的是 object 关键字而不是 class,Kotlin 编译器会将构造方法设置为私有的,并且为 object 类创建一个静态引用,同时在一个静态代码块里初始化该引用。
// 简单工厂方法的例子 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();...Ice Cream Sandwich版本中,删除了ExpatPullParser类来修复这个bug, // 不幸的是,app在Android4.0版本下使用它可能会导致应用crash...".equals(nodeName)) { // 6.创建Channel对象 channel = new...XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser...类来修复这个bug,不幸的是,app在Android4.0版本下使用它可能会导致应用crash, 官方说明文档是用的2步,如我上面写的,就当做是推荐这种写法吧 详情参考博客:https://blog.csdn.net
委托,是一种比较常见的设计模式,通常采用接口或者抽象类的方式来实现,在Java代码中,一般使用接口来进行封装,而在kotlin中,可以通过委托机制来实现更加方便的委托模式。...类委托入门 在一般的业务开发中,我们经常会遇到这样的场景——一个业务功能,有多种实现,通过接口来封装具体的业务方法,通过实现接口来完成不同实现,这样的场景有很多,使用Kotlin来实现这一功能,步骤如下...实际上就是在调用者内部创建一个实现者的变量,在实现的接口方法中,变量调用该方法,从而实现调用,一切都只是语法糖而已,Kotlin帮你简化了代码。...这是类委托最重要的使用场景,通过接口定义来实现多态性,同时使用by关键字来简化Java中接口实现的冗余代码,下面的这个简单的例子,就是一个最好的说明。...val/var : by 在前面的讲解中,类委托,委托的是接口中指定的方法,而属性委托,则委托的是属性的get、set方法,属性委托实际上就是将get、set方法的逻辑委托给一个单独的类来进行实现
三、Class的一些使用技巧 1、forName和newInstance结合起来使用,可以根据存储在字符串中的类名创建对象。...1.forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚)。 2....Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。...3.从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。...三.最后用最简单的描述来区分new关键字和newInstance()方法的区别: 1. newInstance: 弱类型。低效率。只能调用无参构造。 2. new: 强类型。相对高效。
它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。...Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。...从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证: 1、这个类已经加载; 2、这个类已经连接了。...其实上面已经说到一些了,这里来做个总结: 首先,newInstance( )是一个方法,而new是一个关键字; 其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数...,而使用 new关键字生成对象没有这个限制。
饿汉式在类加载时期就已经初始化实例,由于类加载过程是线程安全的,所以饿汉式默认也是线程安全的。它的缺点也很明显,我真正需要单例对象的时机是我调用 getInstance() 的时候,而不是类加载时期。...因此使用了 synchronized 关键字来保障线程安全。但这显然是一个无差别攻击,管你要不要同步,管你是不是多线程,一律给我加锁。这也带来了额外的性能消耗。...同理,创建实例对象的三部中,第 2 步 初始化对象 和 第 3 步 将 mInstance 引用指向对象的内存地址 之间也是可能存在重排序的。...首先枚举单例无疑是线程安全的,类似饿汉式,INSTANCE 的初始化放在了 static 静态代码段中,在类加载阶段执行。由此可见,枚举单例并不是延时加载的。...吹毛求疵的谈了谈单例模式,可以看见要完全的保证单例还是有很多坑点的。在开发中并没有必要钻牛角尖,例如 Kotlin 默认提供的单例实现就是饿汉式而已,其实已经可以满足绝大多数的情况了。
一般情况下,请使用元素,因为 属性无法描述树结构(元素可以) 属性不容易拓展(元素可以) 使用属性的情况:用于分配ID索引,用于标识XML元素。...XML树结构 XML文档中的元素会形成一种树结构,从根部开始,然后拓展到每个树叶(节点),下面将以实例说明XML的树结构。 假设一个XML文件如下 的数据本身也视为一个节点 this.firstChild.childNodes[0].childNodes[1].firstChild ,而不是一个值。...解析方法 解析原理 解析模板代码 注:Android中自带了Pull解析的jar包,故不需额外导入第三方jar包 // Pull使用循环解析 XmlPullParserFactory factory...= XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser = factory.newPullParser(); xml.setInput
我很想念那些可以提高代码可读性、表现力和可维护性的特性。 这篇文章并不是要抨击 Java,而是要列出一些我希望也能在 Java 中找到的特性。...不可变引用在避免恶心的 Bug 方面起到很大作用。有趣的是,对 final 关键字的使用并不是很普遍,即使是在流行的项目中也是如此。...更重要的是,它没有提供与之对应的不可变的 val 关键字,你仍然需要添加 final 关键字,但几乎没有人使用它。 空安全 (Null Safety) 在 Java 中,我们无法知道变量是否为空。...是否使用这些库是可选择的,而在 Kotlin 中,每种类型要么为空,要么为非空。...Kotlin 提供了扩展函数来解决同样的问题。 Kotlin 提供了不通过类继承或使用装饰器等设计模式来实现扩展类或接口的能力。这可以通过一种叫作扩展的特殊声明来实现。
熟悉插件化的童鞋都知道,插件化要解决的有三个基本难题: 插件中 ClassLoader 的问题; 插件中的资源文件访问问题; 插件中 Activity 组件的生命周期问题。...factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser...所以我们只能通过反射的方式来执行了。这样就解决了加载插件中的资源文件的问题了。...和平常无异,我们使用 PluginManager.startActivity 来启动插件中的 Activity 。...所以,我想我们也明白了为什么要花这么大的一个功夫去动态地替换要创建的 Activity ,就是为了绕过这个 ActivityNotFoundException 异常,达到去“欺骗” Android 系统的效果
类与对象 首先Kotlin中定义一个类很简单,如下所示: class Person { } 这是一个空的类实现,可以看到,Kotlin中也是使用class关键字来声明一个类的,这点和Java一致。...He is " + age + " years old.") } } 简单解释一下,这里使用var关键字创建了name和age这两个字段,这是因为我们需要在创建对象之后再指定具体的姓名和年龄,而如果使用...Person类已经定义好了,接下来我们看一下如何对这个类进行实例化,代码如下所示: val p = Person() Kotlin中实例化一个类的方式和Java是基本类似的,只是去掉了new关键字而已。...= 0 } 继承的写法如果只是替换一下关键字倒也挺简单的,但是为什么Person类的后面要加上一对括号呢?...其实原因就是这么简单,只是很多人在刚开始学习Kotlin的时候没能理解这对括号的意义和规则,因此总感觉继承的写法有时候要加上括号,有时候又不要加,搞得晕头转向的,而当你真正理解了之后会发现其实还是很简单的
基于事件触发的解析器 Pull解析器小巧轻便,解析速度快,简单易用 主动从解析器中获取事件,可以在满足了需要的条件后不再获取事件,结束解析 1、Pull解析Xml: private ArrayListXmlPullParserFactory.newInstance(); //XmlPullParser pullParser = factory.newPullParser();...XML 优点:在读取文档的同时即可对XML进行处理,不必等到文档加载结束,相对快捷,所以可以解析超大XML 缺点:只能用来读取XML中数据,无法进行增删改。...并构建出节点树; 应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点、属性等信息; 优点:对XML节点的添加修改等,而且解析也很方便 缺点比较耗费内存,解析速度也不快 1、dom解析Xml...TransformerFactory tff = TransformerFactory.newInstance(); //创建xslt引擎对象输出xml
Kotlin 中存在名为 reified 的关键字,它可以被作用于函数上, 以此做到类型擦除后的再生,便于开发者优雅的使用泛型以及获取方法的泛型类型。...在 Java 中,如果我们要获取函数的泛型类型,一般会通过给函数中传递类型参数的方式,如下所示: public void startActivity(Context...从而让本该在编译阶段被擦除的Activity类型,能够在运行时获取到。 但需要注意的是,reified 关键字必须和 inline 关键字一起使用(下面会提到为什么)。...小提示 Java中无法调用 需要注意的是,reified 无法在java中进行调用,为什么呢?...而 reified 也是正是采用了该思路。 当然也可以采用 @JvmName(name=" xxx") 等方式避免java调用,但其并不是很优雅。
而如果这段代码使用Kotlin来编写的话,将会更加的精简: LitePal.where("duration > ?"...一次不可思议的升级 从上述文章中我们都可以看出,Kotlin版的代码普遍都是比Java代码要更简约的,Google给出的官方统计是,使用Kotlin开发可以减少大约25%以上的代码。...首先,该方法必须是内联方法才行,也就是要用inline关键字来修饰该方法。其次,在声明泛型的地方还必须加上reified关键字来表示该泛型要进行实化。...而通过刚才泛型实化部分的讲解,我们知道Kotlin中是可以使用T::class.java这样的语法的,因此我在LitePal 3.0.0中扩展了这部分特性,允许通过指定泛型来声明查询哪张表中的内容。...注意,这里我使用的是扩展方法,而不是修改了原有方法,这样的话两种写法你都可以使用,全凭自己的喜好,如果是直接修改原有方法,那么项目升级之后就可能会造成大面积报错了,这是谁都不想看到的。
简述: 从这篇文章开始,我将带领大家一起来探讨一下Kotlin眼中的设计模式。说下为什么想着要开始这么一个系列文章。...2、Kotlin中设计模式的实现和Java的实现在某些方面还是有很大的差别的,利用Kotlin语言自身的特性实现设计模式比硬生生套用Java中的设计模式实现要更优雅和更高效。...对象返回而不是去创建一个新的对象 } } //在Kotlin中使用KSingleton fun main(args: Array) { KSingleton.doSomething...,而不是创建新的实例。...中使用单例模式的建议: 一般大多数情况情况下直接使用object对象表达式即可, 因为它比较简单,生成的字节码也相比于静态内部类那种方式要少得多;如果需要懒汉式加载的话还是比较建议使用Kotlin中的by
因为 Java 并没有对函数类型的变量的原生支持,Kotlin 需要想办法来让这种自己新引入的概念在 JVM 中落地。而它想的办法是什么呢?...这,就是 inline 关键字的用处:高阶函数(Higher-order Functions)有它们天然的性能缺陷,我们通过 inline 关键字让函数用内联的方式进行编译,来减少参数对象的创建,从而避免出现性能问题...那我们就也可以正常使用它了。 所以,noinline 的作用是什么?是用来局部地、指向性地关掉函数的内联优化的。既然是优化,为什么要关掉?...因为这种优化会导致函数中的函数类型的参数无法被当做对象使用,也就是说,这种优化会对 Kotlin 的功能做出一定程度的收窄。而当你需要这个功能的时候,就要手动关闭优化了。...总结下来就是: inline 可以让你用内联——也就是函数内容直插到调用处——的方式来优化代码结构,从而减少函数类型的对象的创建; noinline 是局部关掉这个优化,来摆脱 inline 带来的「不能把函数类型的参数当对象使用
领取专属 10元无门槛券
手把手带您无忧上云