public class NeverCrash {    private CrashHandler mCrashHandler;    private static NeverCrash mInstance;    private NeverCrash() {    }    private static NeverCrash getInstance() {        if (mInstance == null) {            synchronized (NeverCrash.class) {                if (mInstance == null) {                    mInstance = new NeverCrash();                }            }        }        return mInstance;    }    public static void init(CrashHandler crashHandler) {        getInstance().setCrashHandler(crashHandler);    }    private void setCrashHandler(CrashHandler crashHandler) {        mCrashHandler = crashHandler;        new Handler(Looper.getMainLooper()).post(new Runnable() {            @Override            public void run() {                for (; ; ) {                    try {                        Looper.loop();                    } catch (Throwable e) {                        if (mCrashHandler != null) {//捕获异常处理                            mCrashHandler.uncaughtException(Looper.getMainLooper().getThread(), e);                        }                    }                }            }        });        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {            @Override            public void uncaughtException(Thread t, Throwable e) {                if (mCrashHandler != null) {//捕获异常处理                    mCrashHandler.uncaughtException(t, e);                }            }        });    }    public interface CrashHandler {        void uncaughtException(Thread t, Throwable e);    }
 
public class App extends Application implements NeverCrash.CrashHandler {    @Override    public void onCreate() {        super.onCreate();        NeverCrash.init(this);    }    private void showToast(final String text) {        if (getMainLooper() == Looper.myLooper()) {            Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();        } else {            new Handler(Looper.getMainLooper()).post(new Runnable() {                @Override                public void run() {                    Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();                }            });        }    }    @Override    public void uncaughtException(Thread t, Throwable e) {        Log.d("Niu", Log.getStackTraceString(e));        showToast(e.getMessage());    }

   其实就是主线程一直监视崩溃信息,一旦发生异常(主或子)都会显示。(以前有人跟我说一旦异常崩溃是不可能避免的,当然这里只是在开发阶段,一旦异常内存就会乱,就会闪退,不知道这是什么意思)至于线上崩溃这个就需要自己做采集分析了,推荐美团的文章https://tech.meituan.com/waimai_android_crash.html

更多相关文章

  1. Android UI主线程和子线程
  2. Android之 UI主线程ZT
  3. Android主线程与子线程的关系
  4. android 在android中教你一行代码判断是不是主线程
  5. android 主线程和子线程之间的消息传递
  6. 去掉非首次开机的优化过程都会有'Android正在升级'的提示
  7. Android主线程与子线程之沟通
  8. Android UI主线程与子线程

随机推荐

  1. 根据Android架构分层推荐开发书籍
  2. Android 中的通知
  3. 【Android】Android动画入门Animation 、
  4. Android手机凡客项目介绍
  5. Android(安卓)UI--自定义ListView(实现下
  6. android最新源码(4.4.2_r1版本以上)下载
  7. 设置系统超时时间
  8. Android之使用Android-query框架进行开发
  9. Android(安卓)UI开发初阶--期末考试Andro
  10. Android MVP 学习笔记