在做项目时,经常会把错误利用异常抛出去,这样在开发时就可以通过手机抛出的异常排查错误。但是当程序开发完毕,版本稳定,需要上线时,为了避免抛出异常影响用户感受,可以用UncaughtExceptionHandler捕获全局异常,对异常做出处理。比如我们可以获取到抛出异常的时间、手机的硬件信息、错误的堆栈信息,然后将获取到的所有的信息发送到服务器中,也可以发送到指定的邮件中,以便及时修改bug。
示例:
自定义异常类实现UncaughtExceptionHandler接口,当某个页面出现异常就会调用uncaughtException这个方法,我们可以在这个方法中获取异常信息、时间等,然后将获取到的信息发送到我们指定的服务器
* 自定义的 异常处理类 , 实现了 UncaughtExceptionHandler接口
* @author Administrator
*
*/
public class MyCrashHandler implements UncaughtExceptionHandler {
// 需求是 整个应用程序 只有一个 MyCrash-Handler
private static MyCrashHandler myCrashHandler ;
private Context context;
private DoubanService service;
private SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
//1.私有化构造方法
private MyCrashHandler(){
}
public static synchronized MyCrashHandler getInstance(){
if(myCrashHandler!=null){
return myCrashHandler;
}else {
myCrashHandler = new MyCrashHandler();
return myCrashHandler;
}
}
public void init(Context context,DoubanService service){
this.context = context;
this.service = service;
}
public void uncaughtException(Thread arg0, Throwable arg1) {
System.out.println("程序挂掉了 ");
// 1.获取当前程序的版本号. 版本的id
String versioninfo = getVersionInfo();
// 2.获取手机的硬件信息.
String mobileInfo = getMobileInfo();
// 3.把错误的堆栈信息 获取出来
String errorinfo = getErrorInfo(arg1);
// 4.把所有的信息 还有信息对应的时间 提交到服务器
try {
service.createNote(new PlainTextConstruct(dataFormat.format(new Date())),
new PlainTextConstruct(versioninfo+mobileInfo+errorinfo), "public", "yes");
} catch (Exception e) {
e.printStackTrace();
}
//干掉当前的程序
android.os.Process.killProcess(android.os.Process.myPid());
}
/**
* 获取错误的信息
* @param arg1
* @return
*/
private String getErrorInfo(Throwable arg1) {
Writer writer = new StringWriter();
PrintWriter pw = new PrintWriter(writer);
arg1.printStackTrace(pw);
pw.close();
String error= writer.toString();
return error;
}
/**
* 获取手机的硬件信息
* @return
*/
private String getMobileInfo() {
StringBuffer sb = new StringBuffer();
//通过反射获取系统的硬件信息
try {
Field[] fields = Build.class.getDeclaredFields();
for(Field field: fields){
//暴力反射 ,获取私有的信息
field.setAccessible(true);
String name = field.getName();
String value = field.get(null).toString();
sb.append(name+"="+value);
sb.append("\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 获取手机的版本信息
* @return
*/
private String getVersionInfo(){
try {
PackageManager pm = context.getPackageManager();
PackageInfo info =pm.getPackageInfo(context.getPackageName(), 0);
return info.versionName;
} catch (Exception e) {
e.printStackTrace();
return "版本号未知";
}
}
}
创建一个Application实例将MyCrashHandler注册到整个应用程序上,创建出服务并进行传递:
/**
* 整个(app)程序初始化之前被调用
* @author Administrator
*
*/
public class DoubanApplication extends Application {
public NoteEntry entry;
@Override
public void onCreate() {
super.onCreate();
String apiKey = "0fab7f9aa21f39cd2f027ecfe65dad67";
String secret = "87fc1c5e99bfa5b3";
// 获取到service
DoubanService myService = new DoubanService("我的小豆豆", apiKey,
secret);
myService.setAccessToken("1fa4e5be0f808a0b5eeeb13a2e819e21", "56a622c1138dbfce");
MyCrashHandler handler = MyCrashHandler.getInstance();
handler.init(getApplicationContext(),myService);
Thread.setDefaultUncaughtExceptionHandler(handler);
}
}
相关推荐
以上就是如何在Android应用中捕获异常并使用Retrofit上传异常信息的详细步骤。通过这种方式,我们不仅可以及时了解应用的运行状况,还能收集到异常发生时的详细信息,有助于问题的定位和修复。同时,用户界面不会...
在Android开发过程中,异常日志捕获是至关重要的一个环节,它可以帮助开发者追踪并解决程序运行时出现的问题。本文将详细讲解如何在Android系统中进行异常日志的捕获、记录以及分析,以便优化和调试应用程序。 首先...
总的来说,捕获并上传Android应用中的异常需要创建一个自定义的`Application`,设置全局的`UncaughtExceptionHandler`,并实现异常收集、日志保存以及异常信息上传到服务器的逻辑。通过这种方式,开发者能够及时获取...
为了提高用户体验,我们还可以在捕获异常后显示一个友好的错误提示,而不是让应用直接崩溃。此外,考虑到网络环境可能不稳定,可以考虑将崩溃信息存储在本地,待网络可用时再进行上传。 总的来说,全局异常捕获和...
本项目聚焦于如何在Android应用程序中有效地捕获异常,并将其上传到Bugly这一第三方错误追踪平台。通过将异常处理模块化,开发者可以更方便地集成到自己的应用中,实现更高效、更系统的错误管理和分析。 首先,我们...
在Eclipse中,使用`DDMS`工具也可以方便地查看设备上的日志,但在全局监听和上传日志方面,步骤与Android Studio一致。 为了提高用户体验,我们通常在应用遇到严重错误或用户触发时才上传日志。可以设置一个按钮,...
这个压缩包“Android捕获全局异常源码”可能包含了以上提到的一些实现,你可以尝试解压并研究其中的代码,学习如何在Android应用中有效地捕获异常和分析日志。注意,由于作者提到部分代码可能不可用,所以在实际使用...
5. **在子线程中捕获异常**:虽然`CrashHandler`主要负责主线程的异常捕获,但你还需要确保在子线程中正确处理异常,通常通过`try-catch`语句来实现。 6. **测试与优化**:实际应用中,你需要对异常处理进行充分的...
本教程将详细讲解如何在Android中实现异常捕获并将其上传到服务器。 首先,我们来理解异常捕获的基本概念。在Java(Android的编程语言)中,异常是程序运行时发生的错误,如空指针异常(NullPointerException)、...
1. **Log类**:Android提供了一个内置的日志系统,主要通过Log类来实现。Log类提供了多种静态方法,如d(), v(), i(), w(), e()等,分别对应调试(debug)、详细 verbose)、信息(info)、警告(warning)和错误(error)级别...
Android系统提供了一个名为Logcat的工具,用于记录应用程序和其他系统组件的输出日志。开发者可以通过adb命令行工具或者Android Studio的Logcat视图查看这些日志。然而,Logcat中的日志会随着设备的重启而丢失。为...
当应用程序遇到无法处理的异常并崩溃时,为了能够快速定位问题并修复,开发者通常会利用崩溃日志上传框架。"Android-AndroidApp崩溃日志上传框架"就是这样一个工具,它允许在App发生崩溃时,不仅将错误信息保存至...
4. **捕获异常信息**: 异常堆栈跟踪是理解错误发生的关键。通过堆栈跟踪,开发者可以看到错误发生的具体位置和调用链,这对于调试和修复bug至关重要。 5. **数据上传服务器**: 为了集中管理异常数据,开发者通常会...
总结,Android全局异常处理是一个多步骤的过程,包括创建监听器、捕获异常、展示反馈、记录日志、发送邮件以及上传服务器。这些步骤可以帮助开发者快速定位和修复问题,提高应用的稳定性和用户体验。在实际项目中,...
因此,实现Android全局异常捕获是一个必要的技术手段,它可以帮助开发者捕获并处理运行时出现的任何异常,避免程序无故终止,并提供调试信息。 全局异常捕获的基本思路是在应用程序的主进程中创建一个顶级的异常...
在Android系统中,我们可以利用`Thread.setDefaultUncaughtExceptionHandler()`方法来设置一个默认的未捕获异常处理器。以下是一个简单的`ExceptionHandler`类的示例: ```java public class Custom...
- 在`uncaughtException`方法中,编写捕获异常后的处理逻辑,比如记录日志、发送错误报告、展示友好的错误提示等。 - 设置自定义的`CrashHandler`为当前应用的默认处理器:`Thread....
本教程将详细介绍如何实现一个功能,即从Android客户端将错误日志压缩并上传到服务器。这个过程涉及客户端的日志记录、文件操作、网络请求以及服务器端的数据接收和处理。 首先,我们要了解Android的日志系统。...