关于Android中Intent传递Serialzilable数据的问题

    以前写程序,若是是队列数据的话,通常都是用ArrayList来做为存储介质,可是如今接手公司的新项目,由于以前这个公司是在windows mobile上实现的(也就是C写的),他们可能更习惯使用Vector,以前也没有了解过Vector,后来查询java的api文档,java确实也有Vector的实现。java

    先看下java中对Vector的描述:(对Vector熟悉的下面这段可不看)
windows

      Vector 类能够实现可增加的对象数组。与数组同样,它包含可使用整数索引进行访问的组件。可是,Vector 的大小能够根据须要增大或缩小,以适应建立 Vector 后进行添加或移除项的操做。api

    从 Java 2 平台 v1.2 开始,此类改进为能够实现 List 接口,使它成为 Java Collections Framework 的成员。与新 collection 实现不一样,Vector 是同步的。 数组

    以前看think in java 中也有提到,Vector与List相比,主要的区别就在于,Vector是同步的,List是非同步的,Vector在迭代的时候是不能对队里的数据进行增删操做的,不然会抛出ConcurrentModificationException异常,同理,在单一线程条件下,Vector的效率较之ArrayList等会更低,所以在Android平台下可能也不太会使用到该类。
spa

      下面就是重点了,先看下Vector的类图:
线程

能够看到Vector是实现了Serializable接口的,因此很显然,Intent是能够传递这样的数据的,可是在实践中仍是发现问题了,当我在Activity A中将Vector数据put进入intent的bundle中时,在Activity B中去取出数据(getSerializable)时,将其强转为Vector,程序会报错,cant Cast ArrayList to Vector(不能将Arraylist转换为Vector类型),见鬼了,后来去搜了下,stackflow上也有哥们问到这样的问题,有人猜想是全部Collection数据在进入Intent后,都被Android强转为Arraylist了,这里我尚未查询Android源码,但根据表现出来的问题也基本是这样的,哪位大神能够看下源码。code

    因此,结论就是,尽可能不要在Android中使用Vector,若是确实由于线程同步的问题必须使用,那当你看到那个类转换异常时也不要惊讶,老老实实把它先用Arraylist盛放起来,再转回到Vector,或者程序的参数或者返回值接口不要写死为Vector,使用List这种泛型,这样也比较有利于程序的扩展。
对象

    算是今天的一点心得,记下来先...索引

相关文章
相关标签/搜索