内存泄漏Exception类-OomExceptionHandler

package com.jaeger.ninegridimgdemo.entity;

import android.content.Context;
import android.os.Debug;

import java.io.File;
import java.io.IOException;

/**
 * Created by 杨阳洋 on 2017/11/23.
 * usg:OOM异常
 */

public class OomExceptionHandler implements Thread.UncaughtExceptionHandler {

    private static final String FILENAME = "out-of-memory.hprof";
    private final Thread.UncaughtExceptionHandler defaultHandler;
    private final Context context;

    public static void install(Context context){
        Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
        if(defaultUncaughtExceptionHandler instanceof OutOfMemoryError) {
            return;
        }
        OomExceptionHandler oomHandler = new OomExceptionHandler(defaultUncaughtExceptionHandler, context);
        Thread.setDefaultUncaughtExceptionHandler(oomHandler);
    }

    public OomExceptionHandler(Thread.UncaughtExceptionHandler defaultHandler, Context context) {
        this.defaultHandler = defaultHandler;
        this.context = context.getApplicationContext();
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        if(containsOom(ex)) {
            File heapDumpFile = new File(context.getFilesDir(), FILENAME);
            try {
                Debug.dumpHprofData(heapDumpFile.getAbsolutePath());
            } catch (IOException e) {

            }
        }
        defaultHandler.uncaughtException(thread, ex);
    }

    private boolean containsOom(Throwable ex){
        if(ex instanceof OutOfMemoryError) {
            return true;
        }
        while ((ex = ex.getCause()) != null){
            if(ex instanceof OutOfMemoryError) {
                return true;
            }
        }
        return false;
    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 描述 在使用handler时,一般我们用于解决跨线程操作的问题,一般开启线程可能是处理耗时操作,因此很可能导致内存...
    zgfei阅读 872评论 0 0
  • 前几天在修复电池项目内存泄漏的地方学到了一个新的知识点. 私有内部类(匿名的私有内部类也算)中会有一个外部类的引用...
    e小e阅读 1,161评论 0 0
  • Handler和内部类怎么引起内存泄漏? 先看下面一段代码: 我们平时使用Handler的时候,相信很多人都会这样...
    瓶子里的王国阅读 2,793评论 6 13
  • 非静态内部类的对象会隐式强引用其外围对象,所以在内部类未释放时,外围对象也不会被释放,从而造成内存泄漏。 参考:A...
    暗尝阅读 3,948评论 0 1
  • 人生是由选择决定,选择是有性格决定的,性格是有环境决定的;每个人不论在生活还是事业,一但做出了选择就毫无退路,无论...
    求研闵阅读 175评论 0 0