zoukankan      html  css  js  c++  java
  • 性能の关于性能优化的思考

       
      概论
     
        很多时候,写代码往往是兴之所至。如行云流水般,想到哪,便可以写到哪,这是多么的让人心旷神怡。然而大多数随兴所至的代码往往缺乏必要的思     考,从而导致一些不必要的内存浪费;这些泄漏累积之下,往往会造成让人头疼的后果,付出难以想象的代价;所以,写代码要学会思考。
     
      思考
      
        Android开发中,一部手机允许我们使用的内存空间屈指可数,标准的内存最大容量预计为16M左右,伴随着手机的发展,可能这个内存会扩展为20多  M,甚  至40多M,对于一个需要展示若干多媒体或者图片的App来说,都是杯水车薪;所以,内存的使用需要我们运筹帷幄,把握在自己手里。
     
      1、 新建变量,我们需要思考
             1)该对象是否必须创建?
             2)该对象是否需要重复创建?
             3)该对象是否复用已经存在的对象?
     
        对于以上的三个问题,我们可以Handler来作为示例,Handler有两个方法,sendEmptyMessage和obtainMessage。当我们需要发送一个通知时,可能   我们压根就不需要发送数据,只是作为一个通知使用,那么此时我们可能会习惯性的
       Message msg  = new Message();
       msg.what = 0; 
       handler.sendMessage(msg);
      然而,sendMessage在一个项目中,我们需要调用太多次,需要新建太多Message对象,所以我们可以从系统池中取出复用的对象
       Message msg  = handler.obtainMessage();
       msg.what = 0; 
       handler.sendMessage(msg);
      通过以上步骤,在整个项目中,我们只需要创建一个Message对象即可,剩下的都可以复用之前的对象。对于只作为通知之用,而无需传递数据的情况
       handler.sendEmptyMessage(0);
      以上一句便足够了。
     
      2、 UI对象,及时释放了吗?
             1)什么对象需要及时释放内存?
             2)这些对象如何释放内存?
     
        在开发中,实现功能所需要的新建变量所占的内存只是很小的一块;打开应用时,往往看到的是花花绿绿的视图,这些视图加载的背景图片,填充着资源  图片,或者占用着其他资源,这些图片资源的渲染所占用的内存相比于功能对象要多的多,然而,GC回收的资源有时候并不及时,所以需要在不显示的时  候将占用的资源释放掉。释放方式就是1)将背景或者资源置空 2)将控件置空,以ImageView为例
       ImageView v;
       if(v != null) {
           v.setImageDrawable(null);
           v = null; 
          }    
     
      3、 Activity/Fragment页面,在销毁时,请不要保持引用!
     
        在开发中,很多人喜欢通过保持Activity引用的方式来实现完全退出吧,一个Activity或Framgnet所占的内存往往占有相当的比重,如果在Activity退出的   时候依旧保持该页面的引用,那么该页面所占的内存便不能够及时有效的回收掉,几个页面下去,嗯,你懂的!
     
      4、不要在重复的逻辑中,建立对象!
     
        在for、while以及遍历等重复的操作中,尽量尽量不要新建对象,除非特别有必要。 特别是在数据量比较大的情况下,加入重复的对象添加其一是需要消   耗大量的内存,其二这些耗费的内存不受我们掌控,不能及时释放掉,会造成很大的隐患。
     
      5、占用内存比较大的变量,在不使用的时候顺便关闭或释放掉,如cursor/db等
     
        在开发中,使用数据库保存一些必要的数据是经常需要的,然而这些操作的cursor或者db等本身保持有不等量的数据或本身就占用大量的资源,在我们执   行完响应的操作后,最好顺手关闭掉,这会使我们的应用做出相应的回馈。
     
      6、良好的控制线程对象
     
        在开发中,数据的请求,文件的传输等都是需要用到线程的,无论是Thread也好,AsyncTask也罢,这些对象本身因为涉及的操作,占据着不小的内存消   耗,所以在执行完或者得到请求的数据后及时的关闭掉,会使得你的应用负担大大的减少。当然网络请求还是建议使用框架来实现,推荐Google原生的        Volley。
     
      7、请注意控制xml界面的层次
      
        在开发中,逻辑的实现需要占据一部分内存空间,视图界面的渲染也要占据一部分的内存,而且涉及到界面的更新,往往需要反复强制渲染,这就使得UI   的内存占用放大了多倍,所以在布局的时候一定要控制xml界面的布局层次,过深的层次布局使得渲染的代价呈指数上升。所以在布局时推荐使用                 Relativelayout。
     
      8、 控制Bitmap的像素
     
        Bitmap占用内存的计算公式: width x height x pixel。在Bitmap的宽度与高度不可改变的情况下,有效的改变图片显示的像素可以大幅度缩减图片所占   的内存空间。这就是看着不大的图片,显示之后会OOM的原因之一,内存相比于原图会瞬间方大几十倍。
     
      9、 图片的加载与释放
     
        在开发中,最占内存空间的资源便是bitmap - 图片,这是众所周知的;图片的内存占用很难控制,包括图片的压缩与释放的时机等。在Java意义上的优     化已经不能满足内存的优化需要,这就是即使添加二级缓存,即使想尽办法去避免还是会产生OOM的原因。所以第九条的优化策略,不是给你们推荐什么   压缩方法与释放,因为这并不能解决问题。真正的解决OOM,最好还是从底层C的层次来使用解决策略,今年五月份Facebook开源的Fresco框架有力的解   决了OOM的问题,该框架从C的层面来解决OOM,解决的很彻底。建议xml的本地图片显示也从Fresco框架来加载,保证彻底解决问题。
     
       还有一篇关于优化的博客,写的挺不错,地址:http://blog.csdn.net/hknock/article/details/47322005
     
        相信从以上几条进行控制后,基本可以完全避免OOM的问题,可以给你一个流畅的应用程序,还你一个好心情!!!如果该文章帮助到了你,还请动手给个赞!
            

     

  • 相关阅读:
    97. Interleaving String
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    94. Binary Tree Inorder Traversal
    odoo many2many字段 指定打开的form视图
    docker sentry 配置文件位置
    postgres 计算时差
    postgres 字符操作补位,字符切割
    postgres判断字符串是否为时间,数字
    odoo fields_view_get
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5177494.html
Copyright © 2011-2022 走看看