讲讲Android开发超常见的内存泄露以及解决
来源:互联网 发布:mac 批量保存网页图片 编辑:程序博客网 时间:2024/04/25 19:29
有没有感觉自己的Android手机开机之后,可用内存不断减少,很大一部分原因就是因为内存泄露了,这部分泄露的内存无法被回收,所以可用内存越来越少;
什么是内存泄露?GC无法回收原本应该被回收的对象,这个对象就引发了内存泄露
1.Bitmap使用完忘记回收,因为bitmap实现部分是通过JNI调用了Native方法,GC机制无法正常回收 Bitmap申请的这部分内存空间(API10之前是这样的,之后分配在Heap中,不过为了兼容老版本…显示的调用一下recycled,让对象变为虚引用,也能让GC到来的几率更高);
那Bitmap应该怎样回收呢?
// bitmap!=null要放在前面,如果bitmap为空再去调用isRecycled方法便会报错
if(bitmap!=null&&!bitmap.isRecycled){ bitmap.recycled(); //回收bitmap bitmap = null;//使bitmap对象变为虚引用,让GC更快的回收}
接下来,讲两个更为常见的内存泄露,大家根据这两个可以自行扩展
btn_hint.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_SHORT).show(); } });
是不是很常见,平时可能也是这样写的(将其封装意义一样,只要引用了当前activity),你可能想问,这里有什么问题吗?
问题在于如果用户在Toast消失之前,用户按了返回键,这个Activity就引起了内存泄露,
原因? Toast持有了当前Activity,导致Activity无法被GC销毁
解决方法:让Toast持有ApplicationContext;其实只要不是Layout,Context都可以使用ApplicationContext;
顺便讲个小技巧:在非Activity中,正常是不能直接getContext来拿到Context的,获取资源有需要靠Context,这时可以考虑在自己的Application中维护一个全局的Context,供无法直接拿到Context的类使用,省的参数传来传去(视图相关的不建议使用ApplicationContext)
private static Context mContext;public static MyApplication getInstance() { //供外界调用... return mApplication;}@Overridepublic void onCreate() { super.onCreate(); mContext = getApplicationContext(); }
另一个常见的…内存泄露
new Thread() { public void run() { //网络请求 };}.start();
这里也有问题?你tm逗我?
在Activity中 新建一个线程,进行网络请求,如果线程未结束,用户按了返回键,同样内存泄露
原因:该Thread是匿名内部类,所以会隐式的持有外部类(这里也就是Activity)
解决方式:多种多样; 不使用匿名内部类,或者整个应用维护一个线程池,或者维护一个线程队列,后两种都是让线程不依赖于Activity从而达到避免内存泄露的目的;
资源获取等等很多地方都需要用到Context,很多地方都会用到匿名内部类,这也就导致了这里存在很大的内存泄露隐患,但平时很多小伙伴可能还没有注意到,希望这篇文章能给你一些启发。
如果对内容有任何疑问或者建议,欢迎留言或者联系作者。Email:mox113@foxmail.com
- 讲讲Android开发超常见的内存泄露以及解决
- Android开发超常见的内存泄露以及解决
- Android常见的泄露以及解决策略
- Android 常见的内存泄露
- android开发中常见的规避内存泄露建议
- Android开发常见内存泄露--非静态内部类引起的内存泄露
- Android 常见内存泄露
- Android 常见内存泄露
- android 开发:InputMethodManager内存泄露解决
- Android下常见的内存泄露
- Android下常见的内存泄露 经典
- Android下常见的内存泄露
- Android下常见的内存泄露
- 一个常见的android内存泄露 问题
- 一个常见的android内存泄露 问题
- Android下常见的内存泄露 经典
- Android下常见的内存泄露 经典
- Android下常见的内存泄露
- BZOJ 3504 [Cqoi2014] 危桥 最大流
- Bootstrap中的弹出框插件popover.js中的参数title、content不能使用html代码
- 北大OJ_1002题:487-3279
- C++基础概念
- 浙江大学PAT_甲级_1046. Shortest Distance (20)
- 讲讲Android开发超常见的内存泄露以及解决
- 解决AD 不能打开DDB文件的解决方案
- keepalived 实现mysql主从自动切换
- 倒计时
- Xilinx FPGA ISE JTAG boundary scan 扫描出 unknown device的问题
- SQL知识积累——常用函数及特殊字符
- 【leetcode c++】 20 Valid Parentheses
- vs2013代码运行窗口一闪而过
- Android 程序框架设计