Android的應用程序的異常處理
1.自定義一個類(MaApp)繼承Application
2.在清單文件中的Application選項菜單對應的name屬性中添加MyApp
3.重寫application中的onCreate方法
4.自定義一個類(MyCrashHandler) 實現UncaughtExceptionHandler實現其中的uncaughtException方法
5.將MyCrashHandler 采用單例設計模式 加入同步代碼塊
6.在MyApp類中的主線程把這個異常捕獲設置進去
1 Thread.currentThread().setUncaughtExceptionHandler(MyCrashHandler.getInstance(getApplicationContext()));
7.異常的處理在MyCrashHandler中的uncaughtException中處理
上代碼
MyApp類
1 package cn.itcast.crash; 2 3 import java.lang.Thread.UncaughtExceptionHandler; 4 5 import android.app.Application; 6 7 public class MyApp extends Application { 8 9 10 /** 11 * 應用程序 的進程在第一次被創建的時候 執行的方法 12 */ 13 @Override 14 public void onCreate() { 15 16 Thread.currentThread().setUncaughtExceptionHandler(MyCrashHandler.getInstance(getApplicationContext())); 17 18 19 20 super.onCreate(); 21 } 22 23 24 25 }
MyCrashHandler類
1 package cn.itcast.crash; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.PrintWriter; 6 import java.io.StringWriter; 7 import java.lang.Thread.UncaughtExceptionHandler; 8 import java.lang.reflect.Field; 9 10 import android.content.Context; 11 import android.content.pm.PackageInfo; 12 import android.os.Build; 13 import android.os.Environment; 14 15 public class MyCrashHandler implements UncaughtExceptionHandler { 16 private MyCrashHandler() { 17 }; 18 private static UncaughtExceptionHandler defaultHandler; 19 //定義一個系統的默認的異常處理的handler 20 private static MyCrashHandler myCrashHandler; 21 private static Context mContext; 22 23 public synchronized static MyCrashHandler getInstance(Context context) { 24 if (myCrashHandler == null) { 25 myCrashHandler = new MyCrashHandler(); 26 mContext = context; 27 defaultHandler = Thread.currentThread().getDefaultUncaughtExceptionHandler(); 28 } 29 return myCrashHandler; 30 } 31 32 /** 33 * 當某一個異常 沒有代碼顯示的捕獲的時候, 系統會調用 默認的異常處理的代碼 處理這個異常 34 */ 35 @Override 36 public void uncaughtException(Thread thread, Throwable ex) { 37 System.out.println("出現了異常,但是被哥捕獲了"); 38 StringWriter wr = new StringWriter(); 39 PrintWriter pw = new PrintWriter(wr); 40 ex.printStackTrace(pw); 41 StringBuilder sb = new StringBuilder(); 42 43 try { 44 PackageInfo packinfo = mContext.getPackageManager().getPackageInfo( 45 mContext.getPackageName(), 0); 46 String version = packinfo.versionName; 47 sb.append("錯誤信息:\n"); 48 sb.append("版本號:" + version + "\n"); 49 50 String errorlog = wr.toString(); 51 sb.append(errorlog); 52 sb.append("\n"); 53 54 // 獲取當前手機操作系統的信息. 55 Field[] fields = Build.class.getDeclaredFields(); 56 for (Field field : fields) { 57 field.setAccessible(true);// 暴力反射,可以獲取私有成員變量的信息 58 String name = field.getName(); 59 String value = field.get(null).toString(); 60 sb.append(name+"="+value+"\n"); 61 } 62 String time ="time:"+ System.currentTimeMillis(); 63 sb.append(time); 64 String log = sb.toString(); 65 File file = new File(Environment.getExternalStorageDirectory(),"error.log"); 66 FileOutputStream fos = new FileOutputStream(file); 67 fos.write(log.getBytes()); 68 fos.flush(); 69 fos.close(); 70 71 android.os.Process.killProcess(android.os.Process.myPid()); 72 //調用系統的默認的異常處理方法 處理這個異常 73 defaultHandler.uncaughtException(thread, ex); 74 75 } catch (Exception e) { 76 e.printStackTrace(); 77 } 78 79 } 80 81 }

浙公網安備 33010602011771號