安卓 rxjava 使用,现在做 Android 开发有前途吗?附面试题答案
简介
35 岁左右对工程师而言是个不同寻常的年龄段。技术人有可能面临人生中的转型:从纯技术岗转向管理岗。也将面临诸多新的挑战,关于组建团队、领导以及 KPI 设置等。本文将讲述阿里资深技术 leader 张荣从去年 1 月底接手 CRO 线 NLP 算法团队以来,在团队组建、能力建设、以及管理上的一些思考。这些思考从实践中来,总结出一套方法论,希望能给予转型中的技术人一些启发。
内存泄漏是什么?
内存泄漏即 ML (Memory Leak)
指 程序在申请内存后,当该内存不需再使用 但 却无法被释放 & 归还给 程序的现象
内存泄漏有哪些情况,对应的解决方案?
内存泄漏的原因归根到底就是当需要被回收变量的内存被其他变量引用持有,导致内存回收失败
常见的原因有:
1.非静态内部类/匿名类
原因 1:
非静态内部类/匿名类 Handler
持有外部的Activity/Fragment
对象的引用,导致Activity/Fragemnt
被销毁的时候没有被回收解决方案:
将 Handler 类改为静态内部类 + 弱引用(
WeakReference
)持有Activity
引用(静态类默认不持有外部的引用)当外部类(一般是
Activity/Fragment
)结束生命周期时,清空 Handler 队列原因 2:
非静态内部类的实例(对象)
=静态实例
(其生命周期 = 应用的生命周期)解决方案:
将该类改为静态类(静态类默认不持有外部的引用)
将该类抽出来封装成为一个单例
原因 3:多线程 工作线程正在处理任务时外部类需要销毁,此时工作线程持有外部类的引用导致无法被回收
解决方案:
将该线程类类改为静态类(静态类默认不持有外部的引用)
当外部类结束生命周期时强制结束线程
2.集合类
原因:集合类添加元素之后持有集合元素的引用,导致该集合元素不可被回收,导致内存泄漏
解决方案:
集合类使用完元素对象后,必须将该元素从集合中删除(由于一个集合中有多个元素,所以最简单的方案就是清空集合对象(clean)&设置为 Null)
3.资源对象使用后未关闭
原因:资源对象使用后未关闭,在 Activity/Fragemnt 销毁时没有关闭/注销这些资源,将导致无法回收 例如:
广播BraodcastReceiver
、文件流Fire
、图片资源Bitmap
、数据库游标
等解决方案:
Activity
销毁时及时关闭/注销资源
4.Static 关键字修饰成员变量
原因:Static 关键字修饰成员变量的生命周期 = 应用的生命周期 例如
private static Context mContext = context
那么 context 上下文对应的Activity
则无法被回收解决方案:
尽量不要使用 Static 成员变量引用,使用弱引用代替强引用
使用单例模式
4.其他使用
原因 1:Context:当拥有
Activity context
的引用的对象仍在使用,则该Activity
需要销毁时无法回收解决方案:
对
context
的引用不要超过它的生命周期使用
ApplicationContext
代替原因 2:WebView:不再使用 WebView 对象后没有及时销毁,导致内存占用
解决方案:
通过多线程对不再使用的
WebView
对象进行销毁原因 3:Adapter:滑动 ListView、RecycleView 获取新 View 时 都在 getView()中重新实例化一个 View 对象,浪费资源,使内存占用越来越大
解决方案:
使用缓存的
convertView
直接使用
ViewHolder
总结
现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。
我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。
Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。
如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
附
(跨平台开发(Flutter)、java 基础与原理,自定义 view、NDK、架构设计、性能优化、完整商业项目开发等)
评论