程序員最頭疼的事情就是bug和debug。此次debug長達20天,搞的我心力交瘁。累,由於Android兼容性,不一樣手機會有不一樣的bug出來,並且很難復現,因此就上網找了下相似保存錯誤log到文件再上傳到服務器,現把源碼也共享出來。上傳至服務器的代碼我沒加。相信你們都有現成的代碼了。 html
先講下原理,跟JavaEE的自定義異常捕獲同樣,將錯誤一直向上拋,而後在最上層統一處理。這裏就能夠得到Exception Message,進行保存操做 android
異常捕獲類以下: 程序員
/**} 服務器
在Application onCreate時就註冊ExceptionHandler,此後只要程序在拋異常後就能捕獲到。 併發
public class Appextends Application{
@Override
public void onCreate() {
super.onCreate();
CrashHandler crashHandler = CrashHandler.getInstance();
//註冊crashHandler
crashHandler.init(getApplicationContext());
}
}
|
public class LogActivityextends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {//製造bug
File file =new File(Environment.getExternalStorageState() ,"crash.bin");
FileInputStream fis =new FileInputStream(file);
byte[] buffer =new byte[1024];
fis.read(buffer);
}catch (Exception e) {
//這裏不能再向上拋異常,若是想要將log信息保存起來,則拋出runtime異常,
// 讓自定義的handler來捕獲,統一將文件保存起來上傳
throw new RuntimeException(e);
}
}
}
|
注意,若是catch後不throw就默認是本身處理了,ExceptionHandler不會捕獲異常了。 app
再分享一個Log的封裝類,只要在這裏設置DEBUG的值就能讓控制檯是否打印出log ide
public class DebugUtil {
public static final String TAG ="ICON";
public static final boolean DEBUG =true;
public static void toast(Context context,String content){
Toast.makeText(context, content, Toast.LENGTH_SHORT).show();
}
public static void debug(String tag,String msg){
if (DEBUG) {
Log.d(tag, msg);
}
}
public static void debug(String msg){
if (DEBUG) {
Log.d(TAG, msg);
}
}
public static void error(String tag,String error){
Log.e(tag, error);
}
public static void error(String error){
Log.e(TAG, error);
}
}
|