我創建了一個類BaseActivity extends AppCompatActivity
,我的Android應用中的所有Activites都從中繼承。在Android中記錄未處理的異常活動
在這個類中,我打算捕獲所有未處理的異常,所以我可以將它們寫入本地SQLite數據庫,以便以後檢查/發送到遠程服務器。
下面附上全班代碼:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
Log.e("Uncaught Exception", paramThrowable.getMessage());
logError(paramThrowable);
defaultHandler.uncaughtException(paramThread, paramThrowable);
}
});
}
private void logError(final Throwable paramThrowable){
try {
ApplicationError error = new ApplicationError();
String stackTrace = "";
for (int i = 0; i < paramThrowable.getStackTrace().length; i++) {
stackTrace += paramThrowable.getStackTrace()[i].toString() + "\n";
}
Throwable tmp = paramThrowable;
int j = 0;
while ((tmp = tmp.getCause()) != null && j < 5) {
j++;
stackTrace += "Coused by:\n";
for (int i = 0; i < tmp.getStackTrace().length; i++) {
stackTrace += tmp.getStackTrace()[i].toString() + "\n";
}
}
Log.e("Saving error...", "");
String deviceInfo = "";
deviceInfo += "OS version: " + System.getProperty("os.version") + "\n";
deviceInfo += "API level: " + Build.VERSION.SDK_INT + "\n";
deviceInfo += "Manufacturer: " + Build.MANUFACTURER + "\n";
deviceInfo += "Device: " + Build.DEVICE + "\n";
deviceInfo += "Model: " + Build.MODEL + "\n";
deviceInfo += "Product: " + Build.PRODUCT + "\n";
error.mDeviceInfo = deviceInfo;
error.mErrorMessage = paramThrowable.getMessage();
error.mStackTrace = stackTrace;
error.save();
Log.e("Saved error:", error.mErrorMessage + "\n" + error.mStackTrace);
}catch(Exception e){
}
}
}
對於澄清:ApplicationError
只是它處理使用DBFlow
保存到數據庫模型類。
問題
每次未處理的異常發生時(不要緊它是什麼)在活動二奇怪的事情發生了:
- 的
logError()
方法被調用一次以上,有時甚至8-10倍。看着日誌,我可以看到他們有幾乎相同的時間戳。 - 消息「XXX申請已停止」顯示在設備屏幕(這是好的),但關閉它後應用程序掛,我需要強制停止從應用程序設置屏幕。
燦任何人能幫助我嗎?還是有解決問題的更好的辦法?
在你的處理器
你知道有框架,會爲你做這個吧? Crashlytics,Acra,Bugsense等 –
執行任何這些支持在同步期間將錯誤發送到自定義服務器應用程序?我需要澄清一點,我需要將錯誤存儲在數據庫中以備以後同步,因爲即使脫機時,應用程序也會記錄錯誤以供稍後同步。 – jdabrowski
所有這些都會緩存發生的錯誤,並在存在活動的網絡連接時發送它們。我相信,ACRA(也許其他人,我不知道)會支持發送到您自己的定製服務器。 –