封裝一個簡單的崩潰監聽類
注意:無法監聽到OOM和ANR異常
CrashUtils
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;
public class CrashUtils {
private static String TAG = "CrashUtils";
public static void startCrashListener(final Context context) {
new Handler(context.getMainLooper()).post(new Runnable() {
@Override
public void run() {
while (true) {
try {
//try-catch主線程的所有異常;Looper.loop()内部是一個死循環,出現異常時才會退出,是以這裡使用while(true)。
Looper.loop();
} catch (Throwable e) {
String message = e.getMessage();
Log.e(TAG, "主線程異常:" + message);
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
// todo 儲存錯誤資訊
}
}
}
});
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
final String message = e.getMessage();
//try-catch子線程的所有異常。
Log.e(TAG, "子線程異常:" + message);
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
// todo 儲存錯誤資訊
}
});
}
});
}
}
使用:
public class App extends Application {
private final String TAG = "APP";
@Override
public void onCreate() {
super.onCreate();
CrashUtils.startCrashListener(this);
}
}