安卓内存泄漏场景

作者: 星林的窗 | 来源:发表于2017-06-24 11:05 被阅读248次

一、匿名内部类持有外部类的引用,如常用的Thread、Handler和AsyncTask
如下:

public class SyncTaskDemoActivity extends Activity {  
    private int today = 0;  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  

        // 异步执行任务  
        new AsyncTask<Object, Void, Boolean>() {  
            @Override  
            protected void onPreExecute() {  
                super.onPreExecute();  
            }  
  
            @Override  
            protected Boolean doInBackground(Object... params) {  
                // do something in backfround  
                // 长时间的耗时  
                while (true) {  
                    today++;  
                    if (today > 100000)  
                        break;  
                }  
                return true;  
            }  
  
            @Override  
            protected void onPostExecute(Boolean result) {  
                super.onPostExecute(result);  
                if (result) {  
                    // success do something  
                } else {  
                    // error  
                }  
            }  
        }.execute();  
    }  
} ```
修改后:

public class SyncTaskDemoActivity extends Activity {
private int today = 0;
private AsyncTask mAsyncTask;

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  

    mAsyncTask = new AsyncTask<Object, Void, Boolean>() {  
        @Override  
        protected void onPreExecute() {  
            super.onPreExecute();  
        }  

        @Override  
        protected Boolean doInBackground(Object... params) {  
            // do something in backfround  
            // 长时间的耗时  
            while (true) {  
                if (cancel(true))  
                    break;  
                today++;  
                if (today > 100000)  
                    break;  
            }  
            return true;  
        }  

        @Override  
        protected void onPostExecute(Boolean result) {  
            super.onPostExecute(result);  
            if (result) {  
                // success do something  
            } else {  
                // error  
            }  
        }  

        @Override  
        protected void onCancelled() {  
            super.onCancelled();  
        }  
    };  
    // 异步执行任务  
    mAsyncTask.execute();  
}  

@Override  
protected void onDestroy() {  
    super.onDestroy();  
    mAsyncTask.cancel(true);  
}  

}


解决办法:继承该类,并声明为静态私有,因为静态私有类不持有外部类的引用,对于AsyncTask可以执行cancle方法

二、静态变量持有该类的实例,销毁时,无法释放该实例
以下代码均会导致内存泄漏

public class MainActivity extends Activity{
private static Context sContext;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sContext = this;
}
}

public class MainActivity extends Activity{
private static View view;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new View(this);
}
}

三、单例模式导致的内存泄漏

public class TestManager{
private List<OnDataArrivedListener> listeners = new ArrayList<>();
private static class SingletonHolder{
public static final TestManager instance = new TestManager();
}

private TestManager(){
    
}

public static TestManager getInstance(){
    return SingletonHolder.instance;
}

public synchronized void registerListener(OnDataArrivedListener listener){
    if (!listeners.equals(listener))
        listeners.add(listener);
}

public synchronized  void unregisterListener(OnDataArrivedListener listener){
    if (listeners.equals(listener))
        listeners.remove(listener);
}

public interface OnDataArrivedListener{
    public void onDataArrived(Object data);
}

}

原因:由于疏忽,忘了写解绑,就会导致内存泄漏

四、属性动画
属性动画持有该类的一个View,若该类销毁时,属性动画还在执行,将导致内存泄漏
解决办法:调用属性动画的cancel

相关文章

  • 安卓内存泄漏场景

    一、匿名内部类持有外部类的引用,如常用的Thread、Handler和AsyncTask如下: public cl...

  • (转载自diycode)2017 Android 面试题分享整理

    Android(安卓) Android基础知识 Android内存泄漏总结 Handler内存泄漏分析及解决 An...

  • android 内存性能

    handle引起的内存泄漏 强引用资源引起的内存泄漏 线程导致的内存泄漏 系统学习安卓内存泄露 large hea...

  • android学习资料

    第一部分: Android(安卓) Android基础知识 Android内存泄漏总结 Handler内存泄漏分析...

  • 安卓内存泄漏

    Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...

  • Android知识体系总结

    第一部分:Android(安卓)Android基础知识Android内存泄漏总结Handler内存泄漏分析及解决H...

  • 安卓内存泄漏测试

    一、测试环境安装(如果已安装可以省略此步骤) 1.adb命令环境安装 sdk文件放置在PC盘符如下图 系统环境变量...

  • Android 非静态内部类/匿名类/Handler引起的内存泄

    一、内存溢出和内存泄漏 内存溢出:Android系统会给每个安卓程序分配一定的内存,当程序所使用的内存超过最大值就...

  • Android内存泄漏详解

    一、Android内存泄漏的本质原因 我们经常看到的说法是,安卓内存泄漏是因为长生命周期的对象持有了短生命周期的引...

  • Android内存泄漏原因

    一、Android内存泄漏的本质原因 我们经常看到的说法是,安卓内存泄漏是因为长生命周期的对象持有了短生命周期的引...

网友评论

    本文标题:安卓内存泄漏场景

    本文链接:https://www.haomeiwen.com/subject/adtkcxtx.html