diff options
Diffstat (limited to 'main/src/cgeo/geocaching/utils/OOMDumpingUncaughtExceptionHandler.java')
| -rw-r--r-- | main/src/cgeo/geocaching/utils/OOMDumpingUncaughtExceptionHandler.java | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/utils/OOMDumpingUncaughtExceptionHandler.java b/main/src/cgeo/geocaching/utils/OOMDumpingUncaughtExceptionHandler.java new file mode 100644 index 0000000..1401542 --- /dev/null +++ b/main/src/cgeo/geocaching/utils/OOMDumpingUncaughtExceptionHandler.java @@ -0,0 +1,79 @@ +package cgeo.geocaching.utils; + +import android.os.Environment; + +import java.io.IOException; +import java.lang.Thread.UncaughtExceptionHandler; + +public class OOMDumpingUncaughtExceptionHandler implements UncaughtExceptionHandler { + + private UncaughtExceptionHandler defaultHandler = null; + private boolean defaultReplaced = false; + + public static boolean activateHandler() { + + final OOMDumpingUncaughtExceptionHandler handler = new OOMDumpingUncaughtExceptionHandler(); + + return handler.activate(); + } + + private boolean activate() { + + defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); + + // replace default handler if that has not been done already + if (!(defaultHandler instanceof OOMDumpingUncaughtExceptionHandler)) { + Thread.setDefaultUncaughtExceptionHandler(this); + defaultReplaced = true; + } else { + defaultHandler = null; + defaultReplaced = false; + } + + return defaultReplaced; + } + + public static boolean resetToDefault() { + + boolean defaultResetted = false; + + final UncaughtExceptionHandler unspecificHandler = Thread.getDefaultUncaughtExceptionHandler(); + + if (unspecificHandler instanceof OOMDumpingUncaughtExceptionHandler) { + final OOMDumpingUncaughtExceptionHandler handler = (OOMDumpingUncaughtExceptionHandler) unspecificHandler; + defaultResetted = handler.reset(); + } + + return defaultResetted; + } + + private boolean reset() { + + final boolean resetted = defaultReplaced; + + if (defaultReplaced) { + Thread.setDefaultUncaughtExceptionHandler(defaultHandler); + defaultReplaced = false; + } + + return resetted; + } + + @Override + public void uncaughtException(final Thread thread, final Throwable ex) { + Log.e("UncaughtException", ex); + Throwable exx = ex; + while (exx.getCause() != null) { + exx = exx.getCause(); + } + if (exx.getClass().equals(OutOfMemoryError.class)) { + try { + Log.e("OutOfMemory"); + android.os.Debug.dumpHprofData(Environment.getExternalStorageDirectory().getPath() + "/dump.hprof"); + } catch (final IOException e) { + Log.e("Error writing dump", e); + } + } + defaultHandler.uncaughtException(thread, ex); + } +} |
