源码简介
本项目就是一个简单的全局异常捕捉例子,捕捉到异常以后可以把异常信息写入文件以供后来分析或者用友好的方式进行提示后再退出程序。
源码运行截图
源码片段:
- public class UncaughtException implements UncaughtExceptionHandler {
- private final static String TAG = "UncaughtException";
- private static UncaughtException mUncaughtException;
- private Context context;
- private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
- // 用来存储设备信息和异常信息
- private Map<string, string=""> infos = new HashMap<string, string="">();
- public Context getContext() {
- return context;
- }
- public void setContext(Context context) {
- this.context = context;
- }
- private UncaughtException() {
- // TODO Auto-generated constructor stub
- }
- /**
- * 同步方法,以免单例多线程环境下出现异常
- *
- * @return
- */
- public synchronized static UncaughtException getInstance() {
- if (mUncaughtException == null) {
- mUncaughtException = new UncaughtException();
- }
- return mUncaughtException;
- }
- /**
- * 初始化,把当前对象设置成UncaughtExceptionHandler处理器
- */
- public void init() {
- Thread.setDefaultUncaughtExceptionHandler(mUncaughtException);
- }
- @Override
- public void uncaughtException(Thread thread, Throwable ex) {
- // TODO Auto-generated method stub
- //处理异常,我们还可以把异常信息写入文件,以供后来分析。
- saveCrashInfo2File(ex);
- Log.e(TAG, "uncaughtException thread : " + thread + "||name=" + thread.getName() + "||id=" + thread.getId() + "||exception=" + ex);
- /* Looper.prepare();
- Toast.makeText(context, "程序异常,立即退出", 1).show();
- System.exit(0);
- Looper.loop();*/
- showDialog() ;
- }
- private void showDialog() {
- new Thread() {
- @Override
- public void run() {
- Looper.prepare();
- new AlertDialog.Builder(context).setTitle("泪奔提示").setCancelable(false).setMessage("大爷我崩溃了...")
- .setNeutralButton("我知道了", new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- System.exit(0);
- }
- }).create().show();
- Looper.loop();
- }
- }.start();
- }
- /**
- * 保存错误信息到文件中
- *
- * @param ex
- * @return 返回文件名称,便于将文件传送到服务器
- */
- private String saveCrashInfo2File(Throwable ex) {
- StringBuffer sb = new StringBuffer();
- long timestamp = System.currentTimeMillis();
- String time = formatter.format(new Date());
- sb.append("\n"+time+"----");
- for (Map.Entry<string, string=""> entry : infos.entrySet()) {
- String key = entry.getKey();
- String value = entry.getValue();
- sb.append(key + "=" + value + "\n");
- }
- Writer writer = new StringWriter();
- PrintWriter printWriter = new PrintWriter(writer);
- ex.printStackTrace(printWriter);
- Throwable cause = ex.getCause();
- while (cause != null) {
- cause.printStackTrace(printWriter);
- cause = cause.getCause();
- }
- printWriter.close();
- String result = writer.toString();
- sb.append(result);
- try {
- String fileName = "exception.log";
- if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
- String path = "/sdcard/crash/";
- File dir = new File(path);
- if (!dir.exists()) {
- dir.mkdirs();
- }
- FileOutputStream fos = new FileOutputStream(path + fileName,true);
- fos.write(sb.toString().getBytes());
- fos.close();
- }
- return fileName;
- } catch (Exception e) {
- Log.e(TAG, "an error occured while writing file...", e);
- }
- return null;
- }
- }</string,></string,></string,>
源码链接:http://down.51cto.com/data/1980812