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


避免使用浮点类型 。在某些可以的情况下,将浮点替换成整型数据,然后进行计算会得到更精确的结果和更快的速度 。
小心使用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 。可以使用<include/> <merge/>将其他布局嵌入到当前布局中 。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的层级关系,如果要修改,使用如下方法:
@Overridepublic void onAnimationEnd(Animation animation) {new Handler().post(new Runnable() {public void run() {myLayout.removeView(mRemoveView);}});}



推荐阅读