1- CrashHandler 知识点的使用

1- CrashHandler 知识点的使用


Android中我们经常遇到错误,根据不同的机型,不同的网络情况,在我们的产品上线之后, 用户在不同的环境中可能会产生不同的bug,但是这些bug是我们在上现在之前的测试环节没有测试出来的隐形bug;而此时我们开发人员没有办法获取buglog日志进行分析,就比较麻烦;此时我们就需要借助 CrashHandler捕获全局异常并且进行处理,将日志发送我们的服务器了;

javaThread中有一个UncaughtExceptionHandler接口,该接口的作用主要是为 了 当 Thread 因未捕获的异常而突然终止时,调用处理程序。
接口下面有setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法,方法主要作用为设置当线程由于未捕获到异常而突然终止时,并且没有为该线程定义其他处理程序时所调用的默认处理程序。

所以我们可以这样设计一个CrashHandler:

1- 写一个CrashHandler类,实现UncaughtExceptionHandler这个接口
public class CrashHandler implements UncaughtExceptionHandler{}
2- 将这个自定义的CrashHandler类 设置到异常发生处理中去,此时异常发生则会调用自定义的处理中的方法
Thread.setDefaultUncaughtExceptionHandler(CrashHandler.getInstance);
3- 因为是全局异常 所以将CranshHandler设置成单列模式,并且在APPlication中调用

/** 获取CrashHandler实例 ,单例模式*/  
  
public static CrashHandler getInstance() {  
    if (instance == null) {  
        instance = new CrashHandler();  
    }  
    return instance;  
}  

4- 实现最重要的 异常发生时候的回调方法 public void uncaughtException(Thread arg0, Throwable arg1){}
5- 进行保存 log和上传后台

除此之外某些第三方也集成了该功能,如友盟提供了次集成sdk,可将bug直接发送到Umeng应用后台

public class CrashHandler implements Thread.UncaughtExceptionHandler {
    private static final String TAG = CrashHandler.class.getSimpleName();
    private static CrashHandler mCrashHandler;

    private CrashHandler(){
    }

    /**
     * 单列模式 全局只有一个
     * @return
     */
    public static CrashHandler getInstance(){
        if(mCrashHandler == null){
            mCrashHandler = new CrashHandler();
        }
        return mCrashHandler;
    }

    public void init(){
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    /**
     * 核心方法,当程序出现crash的时候回调
     * @param thread
     * @param throwable
     */
    @Override
    public void uncaughtException(Thread thread, Throwable throwable) {
        Log.e(TAG, "uncaughtException: CrashHanlder捕获中..." );

        String logName = "_log.txt";
        File logFile = new File(Constant.Log_PATH);
        if(!logFile.exists()){
            logFile.mkdirs();
        }
        PrintWriter printWriter = null;
        StringBuffer stringBuffer = new StringBuffer();
        String device_model = Build.MODEL; // 设备型号
        int version_sdk = Build.VERSION.SDK_INT; // 设备SDK版本
        String version_release = Build.VERSION.RELEASE; // 设备的系统版本
        try {
            printWriter = new PrintWriter(new File(Constant.Log_PATH +File.separator + logName));
            stringBuffer.append("log==》time: "+new Date())
                    .append("\n")
                    .append("device_model: ")
                    .append(device_model)
                    .append("\n")
                    .append("version_sdk: ")
                    .append(version_sdk)
                    .append("\n")
                    .append("version_release: ")
                    .append(version_release)
                    .append("\n")
                    .append(throwable.getMessage());
            StackTraceElement[] stackTrace = throwable.getStackTrace();
            for (StackTraceElement s : stackTrace) {
                stringBuffer.append("file:").append(s.getFileName())
                        .append(" class:").append(s.getClassName())
                        .append(" method:").append(s.getMethodName())
                        .append(" line:").append(s.getLineNumber()).append("\n");
            }
            printWriter.println(stringBuffer.toString());
            printWriter.close();

            //上传到服务器
            //......
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        throwable.printStackTrace();
        //这里可以配置 崩溃之后跳转到开始页面之类的
        android.os.Process.killProcess(Process.myPid());//杀死进程,关闭程序
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
android.os.strictmode.DiskReadViolation at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1596) at libcore.io.BlockGuardOs.open(BlockGuardOs.java:249) at libcore.io.ForwardingOs.open(ForwardingOs.java:166) at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7844) at libcore.io.MemoryMappedFile.mmapRO(MemoryMappedFile.java:54) at libcore.timezone.ZoneInfoDb.loadData(ZoneInfoDb.java:185) at libcore.timezone.ZoneInfoDb.loadTzDataWithFallback(ZoneInfoDb.java:119) at libcore.timezone.ZoneInfoDb.<clinit>(ZoneInfoDb.java:46) at java.util.TimeZone.getTimeZone(TimeZone.java:579) at java.util.TimeZone.getDefaultRef(TimeZone.java:724) at java.util.TimeZone.getDefault(TimeZone.java:700) at java.text.SimpleDateFormat.initializeCalendar(SimpleDateFormat.java:743) at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:687) at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:666) at com.hryt.remoter.uimce.app.CrashHandler.<init>(CrashHandler.java:53) at com.hryt.remoter.uimce.app.CrashHandler.<clinit>(CrashHandler.java:49) at com.hryt.remoter.uimce.app.CrashHandler.getInstance(CrashHandler.java:65) at com.hryt.remoter.uimce.app.RemoterApplication.onCreate(RemoterApplication.java:32) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7013) at android.app.ActivityThread.access$1300(ActivityThread.java:238) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1921) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7958) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:603) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值