Android应用程序出现错误的时候如果直接抛出对用户来说不是很友好,也不便于程序员对应用程序出错分析。所以这个时候我们需要把应用程序报错信息上传到我们的服务器,以便分析日志,修复bug。下面将实现的方法贴出1、创建一个单例类MyCrashHandler实现UncaughtExceptionHandler类,并重写uncaughtException(Thread thread, Throwable ex)方法,(自定义init方法用于传递一个上下文)
public class MyCrashHandler implements UncaughtExceptionHandler {
private static MyCrashHandler myCrashHandler;
private Context context;
private MyCrashHandler() {
}
public static synchronized MyCrashHandler getInstance() {
if(myCrashHandler == null) {
myCrashHandler = new MyCrashHandler();
}
return myCrashHandler;
}
public void init(Context context) {
this.context = context;
}
//程序发生异常的时候调用的方法
@Override
public void uncaughtException(Thread thread, Throwable ex) {
}
}
2、新建一个Myapp类,继承自 Application并重写onCreate()方法,在oncreate方法中将MyCrashHandler类注册上
<application
android:name=".Myapp"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
public class Myapp extends Application {
//在应用程序第一次运行的时候调用
@Override
public void onCreate() {
super.onCreate();
//把自定义的异常处理类设置给主线程
MyCrashHandler myCrashHandler = MyCrashHandler.getInstance();
myCrashHandler.init(getApplicationContext());
Thread.currentThread().setUncaughtExceptionHandler(myCrashHandler);
}
}
3、将异常日志上传:在MyCrashHandler类中方法uncaughtException来实现,代码如下:
@Override
public void uncaughtException(Thread thread, Throwable ex) {
System.out.println("error---------------------------------");
StringBuilder sBuilder = new StringBuilder();
//将log上传到服务器
//1、获取当前应用程序的版本号
try {
PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
sBuilder.append("程序版本号:" + info.versionCode);
sBuilder.append("\n");
//2、获取手机硬件的信息
Field[] fields = Build.class.getDeclaredFields();
for(Field field:fields) {
field.setAccessible(true); //暴力反射获取私有的信息
String name = field.getName();
sBuilder.append(name+ " = ");
String value = field.get(null).toString();
sBuilder.append(value);
sBuilder.append("\n");
}
//3、获取程序的错误堆栈信息
StringWriter stringWriter = new StringWriter();
PrintWriter p = new PrintWriter(stringWriter);
ex.printStackTrace(p);
String result = stringWriter.toString();
sBuilder.append(result);
//4、把错误信息提交到服务器
//Http日志上传操作
} catch (Exception e) {
e.printStackTrace();
}
//完成自杀的操作,程序发生异常后自行退出
android.os.Process.killProcess(android.os.Process.myPid());
}
通过以上步骤可以实现日志上传。