Android开发者必知的内存、性能优化细节(1)

process后面需要记住要有个":",这表示该进程属于你的app。一般情况下,一块基本的空进程需要的内存大小在1.4m左右。

adb shell dumpsys meminfo com.example.android.apis:empty

8、基本性能优化方法的基本原则:

1)不要做你不必要的工作;
2)不要申请不必要的内存;

例如,你明明知道一个方法返回一个String之后,你需要对这个String重新进行修改,那么就不要返回一个String,返回一个StringBuffer会是你更好的选择。

再比如,使用int比使用Integer占用更少的空间。这个大家肯定都是晓得的。

数组比一个Map拥有更好的性能。

如果你的方法不需要访问类字段,那么让你的方法是static的吧,这将会带来15%-20%速度的提升。

对于常量,请尽量使用static and final定义。如果使用final定义常量之后,会减少编译器在类生成时初始化方法调用时对常量的存储,对于int型常量,将会直接使用其数值来进行替换,而对于String对象将会使用相对廉价的“string constant”指令来替换字段查找表。虽然这个方法并不完全对所有类型都有效,但是,将常量声明为static final绝对是一个好的做法。

避免Getters/Setters。虽然在一般的面向对象的设计模式中使用Getter和Setter是稀松平常的事情,但是在Android中使用getters/Setters是一个非常糟糕的主意,方法的调用相对于直接查找字段来说十分的昂贵。在没有JIT的情况下,直接对字段进行访问要比通过Getter访问快了近3倍。在有JIT的情况下,前者比后者快近7倍。

使用最新的循环方式。比如增强for。

避免使用浮点类型。在某些可以的情况下,将浮点替换成整型数据,然后进行计算会得到更精确的结果和更快的速度。

小心使用Native Methods。这里需要纠正的是,Native 方法并不一定能提高你应用的速度,有些甚至会拖后腿,因为,首先来说就需要一部分开销在Java-native transition上,而且JIT并不能对其进行优化。另外你需要为每个你想要在其上运行的系统结构上进行编译;即便是同一个处理器上,你也可能需要多个版本,比如为G1上的ARM处理器编译的就不能很好的在Nexus One的ARM上运行。Native代码最主要的用途是,你已经有了很多native 代码,并且你迫切希望接入Android中。而不是使用Native Method来提高你应用中某部分代码的运行速度。

对于效率的提高除了使用遵守上面两条外基本准则外,选择合适的算法和数据结构也是非常关键的。

9、关于UI上的一些问题

Hierarchy Viewer 通过他,可以看到你自己的Layout文件存在的问题。你可以看到你的Layout每一部分计算,布局,渲染所需要的时间。尽量的使你的Layout扁平话,深度最好保持 在三层之内 。 RelativeLayout 是解决使用LinearLayout堆叠多层问题的利剑。那些为了方便 使 用LinearLayout的layout_weight属性 的哥们,需要重点注意,这个属性真的可以减慢measure速度。所以在使用之前,一定要再三考虑,是否真的不能通过其他方法来完成你要的效果? 官方文档上 推荐使用RelativeLayout和GridLayout来避免Layout深度过深的问题 。 之前看文档,Google提供一个叫 ViewSub 的控件来优化那些不是必须要立即在UI上显示的控件,感兴趣的同学可以去看看。在API Level 1中就提供了这个东西,但是在实际开发中很少见到有人用或者提及(可能是我孤陋寡闻,公司就两个Android开发,另一个还要转IOS,我们俩的Android技术就代表了我们公司的Android技术能力,想想真悲哀!),其实蛮好用的。 重用Layout。可以使用 将其他布局嵌入到当前布局中。 ListView的优化:ViewHolder的使用;AsyncTask的使用;针对ListView当前滑动状态,对图片数据的加载进行控制;(ListView在配以AsyncTask加载图片时需要注 意图片的加载完显示的位置以及图片的缓存问题,具体可以参考Google的 Demo )

10、将大消耗操作交给多个线程。

11、如果你的应用需要发送Broadcast但是又不希望别的应用获取到,或者你不希望处理别的应用发送的同样的action,那么请使用LocalBroadcastManager。

该类是在Android Support v4中提供的,用来在同一个应用内的不同组件之间发送Broadcast。好处上面说了,可以保证应用的私密性。会比全局广播有更高的效率,但是官方文档没有说明具体数值。具体使用方法:

LocalBroadcastManager.getInstance(this).registerReceiver( mStateReceiver, mStatusIntentFilter);

LocalBroadcastManager.getInstance(this).sendBroadcast(localBroadcastIntent);

另外Broadcast的注册一定要放在Activity的有响应的时候注册,一般在onResume()注册,在onPause()的时候取消注册。尽量不要程序走到onDestroy()方法里面才对Broadcast取消注册,因为有些时候不会走到该方法,就会导致崩溃或者再次进入界面是多次注册。

12、关于Fragment使用:

1)无论在哪里使用getResources()方法,都是需要判断是否获取的为null。

2)在使用Fragment+asyntask时的输出结果中最好使用isAdded()方法来判断一下,如果为真,那么才进行后续操作。

13、关于动画

动画结束时,不能修改View的层级关系,如果要修改,使用如下方法:

@Override

public void onAnimationEnd(Animation animation) {

new Handler().post(new Runnable() {

public void run() {

myLayout.removeView(mRemoveView);

}

});

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

这次面试问的还是还是有难度的,要求当场写代码并且运行,也是很考察面试者写代码
因为Android知识体系比较庞大和复杂的,涉及到计算机知识领域的方方面面。在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

系列技术文章等,资源持续更新中…**

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值