62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?
1、创建一个类为CrashHandler
1 import android.content.Context; 2 import android.os.Looper; 3 import android.util.Log; 4 import android.widget.Toast; 5 6 import java.text.DateFormat; 7 import java.text.SimpleDateFormat; 8 import java.util.Locale; 9 10 /** 11 * author: Created by zzl on 15/11/3. 12 */ 13 public class CrashHandler implements Thread.UncaughtExceptionHandler { 14 private static final String TAG = CrashHandler.class.getSimpleName(); 15 16 private static CrashHandler instance; // 单例模式 17 18 private Context context; // 程序Context对象 19 private Thread.UncaughtExceptionHandler defalutHandler; // 系统默认的UncaughtException处理类 20 private DateFormat formatter = new SimpleDateFormat( 21 "yyyy-MM-dd_HH-mm-ss.SSS", Locale.CHINA); 22 23 private CrashHandler() { 24 25 } 26 27 /** 28 * 获取CrashHandler实例 29 * 30 * @return CrashHandler 31 */ 32 public static CrashHandler getInstance() { 33 if (instance == null) { 34 synchronized (CrashHandler.class) { 35 if (instance == null) { 36 instance = new CrashHandler(); 37 } 38 } 39 } 40 41 return instance; 42 } 43 44 /** 45 * 异常处理初始化 46 * 47 * @param context 48 */ 49 public void init(Context context) { 50 this.context = context; 51 // 获取系统默认的UncaughtException处理器 52 defalutHandler = Thread.getDefaultUncaughtExceptionHandler(); 53 // 设置该CrashHandler为程序的默认处理器 54 Thread.setDefaultUncaughtExceptionHandler(this); 55 } 56 57 /** 58 * 当UncaughtException发生时会转入该函数来处理 59 */ 60 @Override 61 public void uncaughtException(Thread thread, Throwable ex) { 62 63 // 自定义错误处理 64 boolean res = handleException(ex); 65 if (!res && defalutHandler != null) { 66 // 如果用户没有处理则让系统默认的异常处理器来处理 67 defalutHandler.uncaughtException(thread, ex); 68 69 } else { 70 try { 71 Thread.sleep(3000); 72 } catch (InterruptedException e) { 73 Log.e(TAG, "error : ", e); 74 } 75 // 退出程序 76 //android.os.Process.killProcess(android.os.Process.myPid()); 77 //System.exit(1); 78 } 79 } 80 81 /** 82 * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 83 * 84 * @param ex 85 * @return true:如果处理了该异常信息;否则返回false. 86 */ 87 private boolean handleException(final Throwable ex) { 88 if (ex == null) { 89 return false; 90 } 91 92 new Thread() { 93 94 @Override 95 public void run() { 96 Looper.prepare(); 97 98 ex.printStackTrace(); 99 String err = "[" + ex.getMessage() + "]"; 100 Toast.makeText(context, "程序出现异常." + err, Toast.LENGTH_LONG) 101 .show(); 102 103 Looper.loop(); 104 } 105 106 }.start(); 107 108 // 收集设备参数信息 \日志信息 109 return true; } 110 }
2、在Application的onCreate()里实例化改crashHandler
1 @Override 2 public void onCreate() { 3 super.onCreate(); 4 initInformData(); 5 mContext = getApplicationContext(); 6 CrashHandler crashHandler = CrashHandler.getInstance(); 7 crashHandler.init(mContext); 8 9 }
这样当APP遇到未捕获的异常时,便不会直接闪退,具体怎么处理就看开发者根据业务需要自己处理了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?