一些闲聊

距离上一篇文章似乎又是很久了,看起来也没有很多反馈,催更就更不用说了。哈哈,放弃了。

话说最近公司在招聘一批至少 5 年开发经验的 Android 开发工程师,我也是忙开了花,激动得不行呀。虽说我面试过的技术开发至少 50 人以上,但这还是第一次开始面试 Android,此时犹如大姑娘上轿,还真是头一回呀!

所以非常非常非常用心地准备了良久,然后满怀激动地开始了我的 Android 面试官角色。

无奈,面试后的感觉,均是开发效率听起来很牛逼,第三方 API 用起来非常顺手,但问到基础,就拿我面试系列的题去问,没一个答得上的,甚至是循循善诱,都没法好好回答。

面试场景

Android 开发中对两个 Activity 之前传递数据,应该很熟悉吧?

嗯,当然没问题。一般采用 Intent.putXXX() 就可以实现各种轻量级数据的传递。

那对于自定义的 Object 呢?

直接使用 BundleputSerializable() 即可。需要把对象实现 Serializable 接口,最后使用 Intent.putExtras(Bundle) 把数据放进 Intent 即可。

除了这种方式,还有其它方式吗?和这种方式有什么区别呢?

我知道还有 Bundle.putParcelable() ,不过我们平时基本都只用 Serializable 方式。

为什么不用 Parcelable 方式呢?它们有什么不同呢?

因为简单呀,Serializable 方式只需要实现接口一句代码就好了,Parcelable 我记得有很多代码。对于它们的区别嘛,em......额......嗯.......

正文

上面的场景,实际上就是在我近期发生的。作为一个简历上 09 年入行的大龄 Android 程序员,我非常肯定他的开发能力和解决问题的能力,在这方面肯定甩我很多条街,不过至少在我问的问题上让我有点大跌眼镜,问到自定义 View 的绘制顺序,直接回答不知道。问到 LauchMode,支支吾吾,不清楚。实际上不由得让我们思考,到底是怎么了,难道现在对于这么多的程序猿,写出符合需求的代码就变得这么重要了么?还好,当下还有很多坚持在一线,努力把基础带给大家的大神,比如,扔物线朱凯,还有非常非常多的伙伴们。

大多数人可能都知道,SerializableParcelable 方式最大的区别是效率上的差异,而且对于小数据,其实差异并不是很大,这些差别其实用户层面是并不容易发现的。但这并不代表着,我们的开发就可以忽视这几十毫秒甚至是几毫秒的差距。

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 还要你何用?相关推荐

  1. c语言为什么要建项目,一个C语言小项目为什么都说牛逼

    原标题:一个C语言小项目为什么都说牛逼 意在鼓励C语言学者.更有兴趣,学习更富有创业和乐趣! 推荐加学习交流群:658807522 可以在一起学习交流,既是参赛选手,又是学者,也可以先学习再参赛,反正 ...

  2. 计算机学渣娃,学渣表示看不懂!WIN10中一个小小计算器都如此牛逼

    Windows 10手机版的第一个预览版本已经发放.虽然前期工作主要是底层平台开发,软件.功能.界面都还很粗糙,但至少咋计算器这个小家伙上,微软已经做得相当完美了. Windows Phone 8.1 ...

  3. 做一款属于自己的“签名设计软件”,外行玩儿过都说牛逼

    1.概述 昨天我们已经详细的介绍了,怎么使用Thinter创建属于自己的窗口界面了.整体布局呢我们已经搭建起来,唯一没有实现的一个步骤就是,用户每输入一个名字,就会将个性签名一并显示在这个窗口界面中, ...

  4. 20个月股票投资经验全面总结,买格力电器也能亏钱,牛逼企业的股票,竟然由傻瓜在定价

    入市20个月了,最近重仓股格力电器,跌宕起伏,有点小激动. 恰逢五一,劳动人民的节日. 打算把宝贵的投资经验,详细总结下,从而尽可能提升自己的投资水平,赚更多的本金. 同时,也希望分享出来,和广大投友 ...

  5. 如何成为一个牛逼的程序员

    一个快乐的人,不是因为他拥有的多,而是因为他计较的少:心态比勤劳更重要,用心做好事. 作为程序员,身边总是有牛逼的前辈.后辈或者同辈.牛逼的人总是让人羡慕.比如自己苦搞一天的 BUG ,头发快抓掉完了 ...

  6. 【转】如何成为一个牛逼的程序员

    来自:http://www.cnblogs.com/preacher/p/4205277.html   说的很有道理!!! 上边这个网站不是原文网站,,,原文网站地址:http://blog.csdn ...

  7. 牛逼的人很早就开始牛逼了

    作者:拾遗君 来源:拾遗(ID:shiyi201633) "牛逼的人很早就开始牛逼了."这话很有道理.虽然有"大器晚成"一说,但罗马绝对不是一天建成的.能够&q ...

  8. 看了28岁华为员工的工资表才知道:牛逼的人注定会牛逼

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨小椰子 来源丨小椰子专栏(ID:xiaoyez ...

  9. python最适合做什么生意-面试了57位数据分析师,我发现牛逼的人都有这4个特质...

    原标题:面试了57位数据分析师,我发现牛逼的人都有这4个特质 现在的职场竞争越来越激烈,不学上一两门新技能,保持自己知识更新,很容易被年轻后辈超越.有些人选择学一门外语,有些人选择学习职场上为人处事的 ...

最新文章

  1. 个人项目【 完成总结】
  2. OpenGL相机控制之一
  3. Python数据可视化之南丁格尔玫瑰图(亲测)
  4. linux centos7 mysql_Linux centos7环境下安装MySQL的步骤详解
  5. Soul网关发布2.2.0 | 让高性能网关变得如此简单!
  6. sqlite 数据量_向SQLite批量导入csv,txt数据
  7. java url authority,Java如何解析url,包括自定义schema的url
  8. 15投影矩阵与Moore-Penrose逆(1)
  9. Python PyQt5 教程
  10. 小白看完都学会了!Jetpack-MVVM-高频提问和解答,面试建议
  11. linux 文件名加粗,konsole与用粗体绘制强调色
  12. RoboCode的Intellij环境搭建
  13. postman使用教程(1)--发送post请求
  14. 不小心把文件夹管理员权限删除的回复方法
  15. 【Python+Excel】批量操作Excel工作表和工作簿的5个实例
  16. 全国手机短信中心号码
  17. [元带你学NVMe协议] ] 插槽接口(M.2 / mSATA / SATA )、总线(PCIE / SATA )、传输协议(NVME / AHCI) 图解
  18. java计算机毕业设计汉服服装租赁系统源码+mysql数据库+系统+lw文档+部署
  19. tf2常用数据类型与常用函数汇总
  20. 走近Ts,用了爽,用后一直爽(一)

热门文章

  1. 2021-2028年中国阻燃装饰行业市场需求与投资规划分析报告
  2. Pandas 使用入门
  3. System.FormatException:“输入字符串的格式不正确。”
  4. PyTorch官方中文文档:torch.optim 优化器参数
  5. Docker入门之 - 如何安装Docker CE
  6. Single Shot Multibox Detection (SSD)实战(下)
  7. 机器视觉系统的几个问题解析
  8. 3D惯导Lidar SLAM
  9. 2021年大数据常用语言Scala(二十五):函数式编程 排序
  10. ValueError: urls must start with a leading slash