• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 5个Android开发中比较常见的内存泄漏问题及解决办法,android比较常见

5个Android开发中比较常见的内存泄漏问题及解决办法,android比较常见

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了5个Android开发中比较常见的内存泄漏问题及解决办法,android比较常见等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

5个Android开发中比较常见的内存泄漏问题及解决办法,android比较常见


android中一个对象已经不需要了,但是其他对象还持有他的引用,导致他不能回收,导致这个对象暂存在内存中,这样内存泄漏就出现了。   内存泄漏出现多了,会是应用占用过多的没存,当占用的内存超过了系统分配的内存容量,就会出现内存溢出了导致应用Crash.   了解了内存泄漏的原因及影响后,我们需要做的就是掌握常见的内存泄漏,并在以后的Android程序开发中,尽量避免它。下面搜罗了5个Android开发中比较常见的内存泄漏问题及解决办法,分享给大家,一起来看看吧。   1.单例造成的内存泄漏   android的单列大家都喜欢使用。但单例模式的静态特征使得他的生命周期和应用的生命周期一样长,这就说明了一个对象不需要使用了,单例对象还持有某个对象,那么这个对象就不能释放了,这就内存泄漏了。 典例:   public class AppManager {     private static AppManager instance;     private Context context;     private AppManager(Context context) {         this.context = context;     }     public static AppManager getInstance(Context context) {         if (instance != null) {             instance = new AppManager(context);         }         return instance;     } }   这个单例需要传入Context对象,所以这个Context的生命周期的长短至关重要: 1、传入的是Application的Context:这将没有任何问题,因为单例的生命周期和Application的一样长 ; 2、传入的是Activity的Context:当这个Context所对应的Activity退出时,由于该Context和Activity的生命周期一样长(Activity间接继承于Context),所以当前Activity退出时它的内存并不会被回收,因为单例对象持有该Activity的引用。 所以正确的单例应该修改为下面这种方式: public class AppManager {     private static AppManager instance;     private Context context;     private AppManager(Context context) {         this.context = context.getApplicationContext();     }     public static AppManager getInstance(Context context) {         if (instance != null) {             instance = new AppManager(context);         }         return instance;     } }   这样不管传入什么Context最终将使用Application的Context,而单例的生命周期和应用的一样长,这样就防止了内存泄漏。   二、非静态内部类创建静态实例造成的内存泄漏     有的时候我们可能会在启动频繁的Activity中,为了避免重复创建相同的数据资源,会出现这种写法: public class MainActivity extends AppCompatActivity {     private static TestResource mResource = null;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         if(mManager == null){             mManager = new TestResource();         }         //...     }     class TestResource {         //...     } }   这样就在Activity内部创建了一个非静态内部类的单例,每次启动Activity时都会使用该单例的数据,这样虽然避免了资源的重复创建,不过这种写法却会造成内存泄漏,因为非静态内部类默认会持有外部类的引用,而又使用了该非静态内部类创建了一个静态的实例,该实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该Activity的引用,导致Activity的内存资源不能正常回收。正确的做法为:   将该内部类设为静态内部类或将该内部类抽取出来封装成一个单例,如果需要使用Context,请使用ApplicationContext 。     三、Handler造成的内存泄漏   Handler的使用造成的内存泄漏问题应该说最为常见了,平时在处理网络任务或者封装一些请求回调等api都应该会借助Handler来处理,对于Handler的使用代码编写一不规范即有可能造成内存泄漏,如下示例:   public class MainActivity extends AppCompatActivity {     private Handler mHandler = new Handler() {         @Override         public void handleMessage(Message msg) {             //...         }     };     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         loadData();     }     private void loadData(){         //...request         Message message = Message.obtain();         mHandler.sendMessage(message);     } }   这种创建Handler的方式会造成内存泄漏,由于mHandler是Handler的非静态匿名内部类的实例,所以它持有外部类Activity的引用,我们知道消息队列是在一个Looper线程中不断轮询处理消息,那么当这个Activity退出时消息队列中还有未处理的消息或者正在处理消息,而消息队列中的Message持有mHandler实例的引用,mHandler又持有Activity的引用,所以导致该Activity的内存资源无法及时回收,引发内存泄漏,所以另外一种做法为:   public class MainActivity extends AppCompatActivity {     private MyHandler mHandler = new MyHandler(this);     private TextView mTextView ;     private static class MyHandler extends Handler {         private WeakReference<Context> reference;         public MyHandler(Context context) {             reference = new WeakReference<>(context);         }         @Override         public void handleMessage(Message msg) {             MainActivity activity = (MainActivity) reference.get();             if(activity != null){                 activity.mTextView.setText("");             }         }     }        @Override     protected void onCreate(Bundle savedInstanceStat
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 5个Android开发中比较常见的内存泄漏问题及解决办法,android比较常见

相关文章

  • 2017-05-26[android] 手机卫士接收短信指令执行相应操作,android接收短信
  • 2017-05-26android studio上的基本动画实现(第一篇),androidstudio
  • 2017-05-26Android 算法 关于递归和二分法的小算法,android二分法
  • 2017-05-26Android Log Tag含义,androidlogtag含义
  • 2017-05-26Android初级教程_获取Android控件的宽和高,初级教程android
  • 2017-05-26Android开发遇到的异常及解决办法,android解决办法
  • 2017-05-26android高仿京东垂直循环滚动新闻栏
  • 2017-05-26Android 学习之路,android学习之路
  • 2017-05-26Android 5.0 Settings源码简要分析
  • 2017-05-26Charles Proxy 4.1.2 破解版,charles4.1.2

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android--绑定服务调用服务的方法
    • Android之SystemUI加载流程和NavigationBar的分析
    • getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir(),mediacachefiles
    • 【玖哥乱弹】Android初学路上会遇到的瓶颈
    • Kotlin中功能操作与集合(KAD 11),
    • Android API Guides---Animation Resources
    • 安卓第十五天笔记-图形图像一些简单处理,安卓第图形图像
    • 再见NullPointerException。在Kotlin里null的处理(KAD 19),kotlinnull
    • okhttp3.4.1+retrofit2.1.0实现离线缓存,retrofitokhttp缓存
    • Android SDK下载和更新失败的解决方法!!!,androidsdk

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有