- public class myApp extends Application {
-
- @Override
-
- public void onCreate() {
-
- super.onCreate();
-
- //初始化异常捕获自定义类
-
- ExceptionCrashHandler ex= ExceptionCrashHandler.getInstance();
-
- ex.init(getApplicationContext());
-
- }
-
- }
在AndroidMianifest.xml里面修改application表情的name为自定义application的类名字
- <application
-
- android:name=".myApp"
-
- 省略其他代码—>
- /**
-
- * 单例的设计模式的异常捕捉
-
- */
-
- public class ExceptionCrashHandler implements Thread.UncaughtExceptionHandler{
-
- private Thread.UncaughtExceptionHandler mDefaultException;
-
- ProgressDialog dialog;
-
- public static ExceptionCrashHandler getInstance(){
-
- if(mInstance==null){
-
- //用来解决多线程并发问题
-
- synchronized (ExceptionCrashHandler.class){
-
- mInstance=new ExceptionCrashHandler();
-
- }
-
- }
-
- return mInstance;
-
- }
-
- private Context mContext;
-
- public void init(Context context){
-
- this.mContext=context;
-
- //把全局的异常捕获设置为当前类
-
- Thread.currentThread().setUncaughtExceptionHandler(this);
-
- //当前线程的异常捕获函数
-
- mDefaultException=Thread.getDefaultUncaughtExceptionHandler();
-
- }
-
- @Override
-
- public void uncaughtException(@NonNull Thread thread, @NonNull Throwable ex) {
-
- //全局异常捕获
-
- Log.d(TAG, "全局异常捕获:"+ ex.toString());
-
- }
-
- }
调用默认未捕获异常的处理方式,也就是闪退,如果没有调用UI视图会处于卡顿的情况,
可以在调用它之前发起ajax,ajax响应后,再调用它
mDefaultException.uncaughtException(thread,ex);
因为当前主线程卡住了,所以最好是开一个新的线程来处理ajax,如下
-
- /**
-
- * 自定义错误处理,收集错误信息 将异常信息保存 发送错误报告等操作均在此完成.
-
- * 但是无法再访问activity
-
- * @param ex
-
- * @return true:如果处理了该异常信息;否则返回false.
-
- */
-
- private boolean handleExample(Throwable ex) {
-
- // 如果已经处理过这个Exception,则让系统处理器进行后续关闭处理
-
- if (ex == null){
-
- return false;
-
- }
-
-
-
-
-
- new Thread(() -> {
-
- // Toast 显示需要出现在一个线程的消息队列中
-
- Looper.prepare();
-
- Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出", Toast.LENGTH_SHORT).show();
-
- Looper.loop();
-
- }).start();
-
- return true;
-
- }
因为ui线程卡住了,无法进行任何的ui操作,而 Toast.makeText是不依赖ui的,ProgressDialog需要activity
如果是跳转新页面的方案,在跳转activivity后关闭崩溃的进程即可
- private void jump(String txt){
-
- // 跳转到崩溃提示Activity
-
- Intent intent = new Intent(mContext, MainActivity2.class);
-
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
- String chancel=getChannelInfo();
-
- Bundle bundle = new Bundle();
-
- //渠道信息
-
- bundle.putString("chancel", chancel);
-
- //错误信息
-
- bundle.putString("err", txt);
-
- intent.putExtras(bundle);
-
- // Log.d(TAG, "jump: "+txt);
-
- mContext.startActivity(intent);
-
- // 关闭已奔溃的app进程
-
- System.exit(0);
-
- }
- private String getChannelInfo(){
-
- ApplicationInfo info;
-
- String chancelInfo="";
-
- try{
-
- PackageManager pm = mContext.getPackageManager();
-
- info = pm.getApplicationInfo( mContext.getPackageName(), PackageManager.GET_META_DATA);
-
- chancelInfo=(String) info.metaData.get("appChannel");
-
- Log.d(TAG, "getChannelInfo: "+chancelInfo);
-
- }
-
- catch (Exception e){
-
- Log.d(TAG, "getChannelInfo: ");
-
- e.printStackTrace();
-
- }
-
- return chancelInfo;
-
- }
xml:
-