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. 在PHP中更改关联数组索引的位置
  2. 使用php将文件上传到AWS S3
  3. Ajax上传插件。handleError未找到
  4. PHP语言的中回车换行
  5. 正则表达式匹配wordpress类似的短代码,用
  6. 在php项目中, mysql视图常用吗?
  7. mysql_fetch_array返回一个数组,数字为“1
  8. 如何创建自己的wiki-Dokuwiki
  9. 如何在php数组中插入新的键值对?
  10. 如何使用PHP在表单中找到移动复制