這是最早參加工作時候?qū)W習(xí)的一個技術(shù),應(yīng)用運行的時候遇到崩潰如何獲仁住?
無論是Android還是iOS县爬,應(yīng)用異常在所難免阳啥,所以就需要處理異常情況下出現(xiàn)的崩潰情況。崩潰總是無法預(yù)知的财喳,不可控的察迟。那么捕獲崩潰的意義在哪里呢?其實耳高,捕獲崩潰的意義很大扎瓶,能通過捕獲到的崩潰日志分析問題,繼而解決問題祝高,防止該異常在下一個版本中繼續(xù)存在栗弟。版本的更新迭代就是一個添加功能污筷,優(yōu)化性能工闺,解決異常的過程。最早的時候很奇怪瓣蛀,應(yīng)用就崩潰了陆蟆,怎么還能獲取到異常信息并且保存呢?當(dāng)時想的顯然這是不可能實現(xiàn)的惋增。但是通過了解了異常捕獲和拋出的過程叠殷,可以發(fā)現(xiàn)異常的捕獲及之后的一系列處理都是可控的。應(yīng)用中異常會經(jīng)常出現(xiàn)诈皿,只不過有的異常沒有被捕獲處理林束,這樣就會導(dǎo)致應(yīng)用崩潰像棘。這個時候異常信息就交給系統(tǒng)虛擬機(jī)進(jìn)行處理,虛擬機(jī)會Crash應(yīng)用壶冒,出現(xiàn)崩潰的情況缕题。我們捕獲崩潰日志就是在異常交給虛擬機(jī)之前,應(yīng)用本身獲取一下日志信息胖腾,進(jìn)而做一些保存或者上傳的操作烟零。實現(xiàn)獲取異常日志,分析日志的操作咸作。
就提實現(xiàn)非常簡單锨阿,這里就以把崩潰日志保存成文件的簡單方式為例,說明整個過程记罚。創(chuàng)建捕獲全局異常的類墅诡,捕獲應(yīng)用中未處理的異常,即崩潰情況:
<pre>
public class CrashHandler implements UncaughtExceptionHandler {
private static CrashHandler instance;
private Context ctx;
public static CrashHandler getInstance() {
if (instance == null) {
instance = new CrashHandler();
}
return instance;
}
public void init(Context ctx) {
this.ctx = ctx;
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
String logdir;
if (Environment.getExternalStorageDirectory() != null) {
logdir = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "hbdLog";
File file = new File(logdir);
boolean mkSuccess;
if (!file.isDirectory()) {
mkSuccess = file.mkdirs();
if (!mkSuccess) {
mkSuccess = file.mkdirs();
}
}
try {
FileWriter fw = new FileWriter(logdir + File.separator + "error.log", true);
if (fw != null) {
fw.write(new Date() + "\n");
StackTraceElement[] stackTrace = arg1.getStackTrace();
fw.write(arg1.getMessage() + "\n");
for (int i = 0; i < stackTrace.length; i++) {
fw.write("file:" + stackTrace[i].getFileName() + " class:" + stackTrace[i].getClassName()+ " method:" + stackTrace[i].getMethodName() + " line:" + stackTrace[i].getLineNumber() + "\n");
}
fw.write("\n");
fw.close();
}
} catch (IOException e) {
Log.e("crash handler", "load file failed...", e.getCause());
}
}
arg1.printStackTrace();
System.exit(0);
}
}
</pre>
將捕獲異常類應(yīng)用到APP中桐智,僅需要在Application中的OnCreate方法中添加兩句話书斜,使其生效:
<pre>
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(this);
</pre>