Serializable 都这么牛逼了,Parcelable 还要你何用?
一些闲聊
距离上一篇文章似乎又是很久了,看起来也没有很多反馈,催更就更不用说了。哈哈,放弃了。
话说最近公司在招聘一批至少 5 年开发经验的 Android 开发工程师,我也是忙开了花,激动得不行呀。虽说我面试过的技术开发至少 50 人以上,但这还是第一次开始面试 Android,此时犹如大姑娘上轿,还真是头一回呀!
所以非常非常非常用心地准备了良久,然后满怀激动地开始了我的 Android 面试官角色。
无奈,面试后的感觉,均是开发效率听起来很牛逼,第三方 API 用起来非常顺手,但问到基础,就拿我面试系列的题去问,没一个答得上的,甚至是循循善诱,都没法好好回答。
面试场景
Android 开发中对两个 Activity 之前传递数据,应该很熟悉吧?
嗯,当然没问题。一般采用 Intent.putXXX()
就可以实现各种轻量级数据的传递。
那对于自定义的 Object 呢?
直接使用 Bundle
的 putSerializable()
即可。需要把对象实现 Serializable
接口,最后使用 Intent.putExtras(Bundle)
把数据放进 Intent
即可。
除了这种方式,还有其它方式吗?和这种方式有什么区别呢?
我知道还有 Bundle.putParcelable()
,不过我们平时基本都只用 Serializable
方式。
为什么不用
Parcelable
方式呢?它们有什么不同呢?
因为简单呀,Serializable
方式只需要实现接口一句代码就好了,Parcelable
我记得有很多代码。对于它们的区别嘛,em......额......嗯.......
正文
上面的场景,实际上就是在我近期发生的。作为一个简历上 09 年入行的大龄 Android 程序员,我非常肯定他的开发能力和解决问题的能力,在这方面肯定甩我很多条街,不过至少在我问的问题上让我有点大跌眼镜,问到自定义 View 的绘制顺序,直接回答不知道。问到 LauchMode,支支吾吾,不清楚。实际上不由得让我们思考,到底是怎么了,难道现在对于这么多的程序猿,写出符合需求的代码就变得这么重要了么?还好,当下还有很多坚持在一线,努力把基础带给大家的大神,比如,扔物线朱凯,还有非常非常多的伙伴们。
大多数人可能都知道,Serializable
和 Parcelable
方式最大的区别是效率上的差异,而且对于小数据,其实差异并不是很大,这些差别其实用户层面是并不容易发现的。但这并不代表着,我们的开发就可以忽视这几十毫秒甚至是几毫秒的差距。
Serializable 和 Parcelable 的区别
可以肯定的是,两者都是支持序列化和反序列化的操作。
两者最大的区别在于 存储媒介的不同,Serializable
使用 I/O 读写存储在硬盘上,而 Parcelable
是直接 在内存中读写。很明显,内存的读写速度通常大于 IO 读写,所以在 Android 中传递数据优先选择 Parcelable
。
Serializable
会使用反射,序列化和反序列化过程需要大量 I/O 操作, Parcelable
自已实现封送和解封(marshalled &unmarshalled)操作不需要用反射,数据也存放在 Native 内存中,效率要快很多。
有人直接比较过两个的效率差别
我们可以来看看分别怎么写?
- Serializable 「简单易用」一直都是它的代名词
public class TestSerializable implements Serializable {String msg;List<ItemBean> datas;public static class ItemBean implements Serializable{String name;}
}
- Parcelable 速度至上
public class TestParcelable implements Parcelable {String msg;@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(this.msg);}TestParcelable(String msg) {this.msg = msg;}private TestParcelable(Parcel in) {this.msg = in.readString();}public static final Creator<TestParcelable> CREATOR = new Creator<TestParcelable>() {@Overridepublic TestParcelable createFromParcel(Parcel source) {return new TestParcelable(source);}@Overridepublic TestParcelable[] newArray(int size) {return new TestParcelable[size];}};
}
很明显,Parcelable
实现起来并不容易,它有成吨的模板代码,这使得对象变得难以阅读和维护。但如果你真的想成为一个优秀的 Android 开发工程师,你可能就得多在 Parcelable
上花点时间了。实在想偷懒也没事,因为有人在 GitHub 上已经上传了 Android Studio 的插件,帮助你自动生成这一堆模板。
地址:https://github.com/mcharmas/android-parcelable-intellij-plugin
在两个 Activity 之间传递对象还需要注意什么呢?
对象的大小,对象的大小,对象的大小!!!
重要的事情说三遍,一定要注意对象的大小。Intent
中的 Bundle
是使用 Binder
机制进行数据传送的。能使用的 Binder 的缓冲区是有大小限制的(有些手机是 2 M),而一个进程默认有 16 个 Binder
线程,所以一个线程能占用的缓冲区就更小了( 有人以前做过测试,大约一个线程可以占用 128 KB)。所以当你看到 The Binder transaction failed because it was too large
这类 TransactionTooLargeException
异常时,你应该知道怎么解决了。
转载于:https://www.cnblogs.com/liushilin/p/7977424.html
Serializable 都这么牛逼了,Parcelable 还要你何用?相关推荐
- c语言为什么要建项目,一个C语言小项目为什么都说牛逼
原标题:一个C语言小项目为什么都说牛逼 意在鼓励C语言学者.更有兴趣,学习更富有创业和乐趣! 推荐加学习交流群:658807522 可以在一起学习交流,既是参赛选手,又是学者,也可以先学习再参赛,反正 ...
- 计算机学渣娃,学渣表示看不懂!WIN10中一个小小计算器都如此牛逼
Windows 10手机版的第一个预览版本已经发放.虽然前期工作主要是底层平台开发,软件.功能.界面都还很粗糙,但至少咋计算器这个小家伙上,微软已经做得相当完美了. Windows Phone 8.1 ...
- 做一款属于自己的“签名设计软件”,外行玩儿过都说牛逼
1.概述 昨天我们已经详细的介绍了,怎么使用Thinter创建属于自己的窗口界面了.整体布局呢我们已经搭建起来,唯一没有实现的一个步骤就是,用户每输入一个名字,就会将个性签名一并显示在这个窗口界面中, ...
- 20个月股票投资经验全面总结,买格力电器也能亏钱,牛逼企业的股票,竟然由傻瓜在定价
入市20个月了,最近重仓股格力电器,跌宕起伏,有点小激动. 恰逢五一,劳动人民的节日. 打算把宝贵的投资经验,详细总结下,从而尽可能提升自己的投资水平,赚更多的本金. 同时,也希望分享出来,和广大投友 ...
- 如何成为一个牛逼的程序员
一个快乐的人,不是因为他拥有的多,而是因为他计较的少:心态比勤劳更重要,用心做好事. 作为程序员,身边总是有牛逼的前辈.后辈或者同辈.牛逼的人总是让人羡慕.比如自己苦搞一天的 BUG ,头发快抓掉完了 ...
- 【转】如何成为一个牛逼的程序员
来自:http://www.cnblogs.com/preacher/p/4205277.html 说的很有道理!!! 上边这个网站不是原文网站,,,原文网站地址:http://blog.csdn ...
- 牛逼的人很早就开始牛逼了
作者:拾遗君 来源:拾遗(ID:shiyi201633) "牛逼的人很早就开始牛逼了."这话很有道理.虽然有"大器晚成"一说,但罗马绝对不是一天建成的.能够&q ...
- 看了28岁华为员工的工资表才知道:牛逼的人注定会牛逼
Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨小椰子 来源丨小椰子专栏(ID:xiaoyez ...
- python最适合做什么生意-面试了57位数据分析师,我发现牛逼的人都有这4个特质...
原标题:面试了57位数据分析师,我发现牛逼的人都有这4个特质 现在的职场竞争越来越激烈,不学上一两门新技能,保持自己知识更新,很容易被年轻后辈超越.有些人选择学一门外语,有些人选择学习职场上为人处事的 ...
最新文章
- 个人项目【 完成总结】
- OpenGL相机控制之一
- Python数据可视化之南丁格尔玫瑰图(亲测)
- linux centos7 mysql_Linux centos7环境下安装MySQL的步骤详解
- Soul网关发布2.2.0 | 让高性能网关变得如此简单!
- sqlite 数据量_向SQLite批量导入csv,txt数据
- java url authority,Java如何解析url,包括自定义schema的url
- 15投影矩阵与Moore-Penrose逆(1)
- Python PyQt5 教程
- 小白看完都学会了!Jetpack-MVVM-高频提问和解答,面试建议
- linux 文件名加粗,konsole与用粗体绘制强调色
- RoboCode的Intellij环境搭建
- postman使用教程(1)--发送post请求
- 不小心把文件夹管理员权限删除的回复方法
- 【Python+Excel】批量操作Excel工作表和工作簿的5个实例
- 全国手机短信中心号码
- [元带你学NVMe协议] ] 插槽接口(M.2 / mSATA / SATA )、总线(PCIE / SATA )、传输协议(NVME / AHCI) 图解
- java计算机毕业设计汉服服装租赁系统源码+mysql数据库+系统+lw文档+部署
- tf2常用数据类型与常用函数汇总
- 走近Ts,用了爽,用后一直爽(一)
热门文章
- 2021-2028年中国阻燃装饰行业市场需求与投资规划分析报告
- Pandas 使用入门
- System.FormatException:“输入字符串的格式不正确。”
- PyTorch官方中文文档:torch.optim 优化器参数
- Docker入门之 - 如何安装Docker CE
- Single Shot Multibox Detection (SSD)实战(下)
- 机器视觉系统的几个问题解析
- 3D惯导Lidar SLAM
- 2021年大数据常用语言Scala(二十五):函数式编程 排序
- ValueError: urls must start with a leading slash