非静态内部类可能导致的内存泄漏及其优化
来源:互联网 发布:mac os 10.13 开机慢 编辑:程序博客网 时间:2024/06/05 02:47
转自http://blog.csdn.net/lfdfhl/article/details/45696165
- 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;
- @Override
- protected 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{
- @Override
- public void run() {
- super.run();
- //Activity activity=MainActivity.this;
- }
- }
- //优化后的方式
- private static class BetterThread extends Thread {
- private boolean isRunning = true;
- @Override
- public void run() {
- super.run();
- while(isRunning){
- //doing something
- }
- }
- public void stopThread(){
- isRunning=false;
- }
- }
- //停止线程
- @Override
- protected void onDestroy() {
- mBetterThread.stopThread();
- super.onDestroy();
- }
- }
0 0
- 非静态内部类可能导致的内存泄漏及其优化
- 非静态内部类可能导致的内存泄漏及其优化
- 非静态内部类可能导致的内存泄漏及其优化
- Handler可能导致的内存泄漏及其优化
- Handler可能导致的内存泄漏及其优化
- 非静态内部类造成的内存泄漏
- Android内存泄漏(非静态内部类创建静态实例造成的内存泄漏)
- Android 非静态内部类导致的内存泄露(非static内部类)
- Android 非静态内部类导致的内存泄露(非static内部类)
- Android 非静态内部类导致内存泄漏原因深入剖析
- Android 非静态内部类导致内存泄漏原因深入剖析
- 内部类导致内存泄漏的情况
- 非静态内部类创建静态实例造成的内存泄漏
- Android 非静态内部类/匿名类引起的内存泄漏
- android-内部类导致的内存泄漏实战解析
- Android:Handler,内部类导致的可能内存泄露
- 【内存泄露】Android内存泄漏---非静态内部类创建静态实例
- 内存优化-内存泄漏处理内部类
- PyQT4文本框中文显示编码问题详解
- 基于GOLDENGATE实现数据实时分发
- SD卡文件浏览器案例
- leetcode 318. Maximum Product of Word Lengths
- CSRF 攻击的应对之道
- 非静态内部类可能导致的内存泄漏及其优化
- Dapper.NET使用入门(一)【LINQ2Dapper】
- 170.Jump Game II
- SSM框架+Log4j框架搭建
- iOS UILabel设置行间距和字间距并计算高度
- Linux常用命令总结
- Handler可能导致的内存泄漏及其优化
- CentOS更换主机连接问题
- spring log4j mongodb 关闭debug日志输出