非静态内部类可能导致的内存泄漏及其优化
来源:互联网 发布:旗袍淘宝专买长款旗袍 编辑:程序博客网 时间:2024/06/05 12:39
package cc.cc;import android.os.Bundle;import android.app.Activity;/** * Demo描述: * 非静态内部类可能导致的内存泄露及其优化 * * 在MainActivity中定义了两个内部类InnerClassTest和ThreadSubClass. * 在这里需要注意一个问题: * 内部类持有外部类的引用!!!! * 或者说内部类对外部类持有隐式的引用!!!! * * 假如我们在内部类中做耗时的操作或者说有个while(true)死循环,即内部类的对象一直存在; * 那么当这个MainActivity应该被回收时(比如屏幕的旋转)GC发现它还被其内部类的对象引用 * 所以就不会将其回收.假如该Activity中含有大量的资源(比如图片)那么就很容易发生OOM. * * 优化方式: * 使用静态的内部类,这样的内部类就不会持有外部类的隐式引用;也就不会影响到GC对于外部类的回收 * * * 参考资料: * 1 http://blog.csdn.net/guolin_blog/article/details/42238633 * 2 http://blog.csdn.net/tu_bingbing/article/details/10395129 * 3 http://blog.csdn.net/zhangjg_blog/article/details/20000769 * 4 http://blog.csdn.net/zhongwcool/article/details/22886067 * 5 http://foolog.net/wap/index-wap2.php?p=2550 * 6 http://blog.csdn.net/theone10211024/article/details/45645309 * 7 http://blog.csdn.net/tu_bingbing/article/details/10350533 * 8 http://www.eoeandroid.com/thread-571279-1-1.html * 9 http://2dxgujun.com/post/2014/09/11/Handler-Leaks-Solution.html * Thank you very much * */public class MainActivity extends Activity { private BetterThread mBetterThread;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}private void init(){mBetterThread=new BetterThread();mBetterThread.start();}//定义一个内部类private class InnerClassTest {private InnerClassTest() {}private void methodA() {//Activity activity=MainActivity.this;}private void methodB() {}}//定义一个内部类private class ThreadSubClass extends Thread{@Overridepublic void run() {super.run();//Activity activity=MainActivity.this;}}//优化后的方式private static class BetterThread extends Thread {private boolean isRunning = true;@Overridepublic void run() {super.run();while(isRunning){//doing something}}public void stopThread(){isRunning=false;}}//停止线程@Overrideprotected void onDestroy() {mBetterThread.stopThread();super.onDestroy();}}
2 0
- 非静态内部类可能导致的内存泄漏及其优化
- 非静态内部类可能导致的内存泄漏及其优化
- 非静态内部类可能导致的内存泄漏及其优化
- Handler可能导致的内存泄漏及其优化
- Handler可能导致的内存泄漏及其优化
- 非静态内部类造成的内存泄漏
- Android内存泄漏(非静态内部类创建静态实例造成的内存泄漏)
- Android 非静态内部类导致的内存泄露(非static内部类)
- Android 非静态内部类导致的内存泄露(非static内部类)
- Android 非静态内部类导致内存泄漏原因深入剖析
- Android 非静态内部类导致内存泄漏原因深入剖析
- 内部类导致内存泄漏的情况
- 非静态内部类创建静态实例造成的内存泄漏
- Android 非静态内部类/匿名类引起的内存泄漏
- android-内部类导致的内存泄漏实战解析
- Android:Handler,内部类导致的可能内存泄露
- 【内存泄露】Android内存泄漏---非静态内部类创建静态实例
- 内存优化-内存泄漏处理内部类
- Discuz!3.2QQ互联1.18.2内部错误,无法显示此内容_此帐号已被注册_登录后跳转到完善资料页无反映解决办法
- 指向指针的指针做函数的参数
- Fragment和FragmentActivity的使用方法
- 【第八章】 对ORM的支持 之 8.2 集成Hibernate3 ——跟我学spring3
- API Guides -> Introduction -> Introduction to Android
- 非静态内部类可能导致的内存泄漏及其优化
- POJ 1679 The Unique MST
- 动态规划:从新手到专家
- mysql日志详细解析
- leetcod--Reverse Bits
- Leetcode Minimum Depth of Binary Tree 二叉树最小深度
- 欧拉函数及其扩展
- long或date型的时间处理成合理的时间格式以便前台显示
- 最新版SDWebImage的使用