package org.qii.weiciyuan.support.crashmanager; import org.qii.weiciyuan.support.file.FileManager; import android.text.TextUtils; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.Comparator; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * User: qii * Date: 13-3-21 */ public class CrashManager { private static final int MAX_LOG_FILES = 10; public static void registerHandler() { Thread.UncaughtExceptionHandler currentHandler = Thread .getDefaultUncaughtExceptionHandler(); // Register if not already registered if (!(currentHandler instanceof ExceptionHandler)) { Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(currentHandler)); } ScheduledExecutorService scheduledExecutorService = Executors .newSingleThreadScheduledExecutor(); scheduledExecutorService.schedule(new ClearLogTask(), 5, TimeUnit.SECONDS); } private static class ClearLogTask implements Runnable { @Override public void run() { onlyLeftTenLogFilesInStorage(); } } private static void onlyLeftTenLogFilesInStorage() { String[] files = searchForStackTraces(); if (files == null) { return; } int length = files.length; if (length > MAX_LOG_FILES) { for (int i = MAX_LOG_FILES; i < length; i++) { new File(files[i]).delete(); } } } private static String[] searchForStackTraces() { String path = FileManager.getLogDir(); if (TextUtils.isEmpty(path)) { return new String[0]; } // Try to create the files folder if it doesn't exist File dir = new File(path); // Filter for ".stacktrace" files FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".stacktrace"); } }; String[] files = dir.list(filter); for (int i = 0; i < files.length; i++) { files[i] = path + File.separator + files[i]; } //desc sort arrays, then delete the longest file Arrays.sort(files, new Comparator<String>() { @Override public int compare(String aFilePath, String bFilePath) { long aDate = new File(aFilePath).lastModified(); long bDate = new File(bFilePath).lastModified(); return (aDate > bDate ? -1 : 1); } }); return files; } }