package io.bxbxbai.swipeplaybar; import android.os.SystemClock; import android.util.Log; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * Android应用中的秒表工具,跟踪某一段代码的执行时间<br/> * 调用begin方法启动秒表,并在当前时间打上tag。当你再调用end方法时,TimeTester就会输出这个tag的时间差,并删除tag<br/> * * 如果你调用lap方法,就相当于计次,不会删除tag,可以多次调用 * * @author xuebin.bai * @version 1.0.0 * @since 2014.08.01 */ public final class StopWatch { private static final String TAG = StopWatch.class.getSimpleName(); private static final Map<String, Long> TIME = new ConcurrentHashMap<String, Long>(); private static final int INT_THOUSAND = 1000; /** * 给当前时间打上一个tag * @param tag tag */ public static void begin(String tag) { begin(tag, false); } /** * 给当前时间打上一个tag * @param tag tag * @param needPrint 是否打印begin的tag */ public static void begin(String tag, boolean needPrint) { TIME.put(tag, SystemClock.uptimeMillis()); if (needPrint) { Log.i(TAG, "begin: " + tag); } } /** * 计算当前时间和之前打上tag的时间差 * * @param tag tag * @return 运行的时间(ms) */ public static long end(String tag) { return end(tag, ""); } /** * 计算当前时间和之前打上tag的时间差 * * @param tag tag * @param needPrint 是否打印begin的tag * @return 运行的时间(ms) */ public static long end(String tag, boolean needPrint) { long t = lap(tag, "", needPrint); TIME.remove(tag); return t; } /** * 计算当前时间和之前打上tag的时间,并删除tag * @param tag tag * @param extra 额外信息 * @return 运行的时间(ms) */ public static long end(String tag, String extra) { long t = lap(tag, extra, true); TIME.remove(tag); return t; } /** * 计算当前时间和之前打上tag的时间差,不删除tag * * @param tag tag */ public static void lap(String tag) { lap(tag, "", true); } /** * 计算当前时间和之前打上tag的时间差,不删除tag * * @param tag tag * @param extra extra */ public static void lap(String tag, String extra) { lap(tag, extra, true); } /** * 计算当前时间和之前打上tag的时间差,不删除tag * @param tag tag * @param extra 额外信息 * @param needPrint 是否打印begin的tag * @return 运行的时间(ms) */ public static long lap(String tag, String extra, boolean needPrint) { extra = extra != null && extra.length() > 0 ? ", " + extra : ""; long t = -1; if (TIME.containsKey(tag)) { t = (SystemClock.uptimeMillis() - TIME.get(tag)); String time = t > INT_THOUSAND ? (double)t / INT_THOUSAND + "s" : t + "ms"; if (needPrint) { Log.i(TAG, tag + ": " + time + ", " + extra); } } else { if (needPrint) { Log.e(TAG, "You did NOT CALL StopWatch.begin(" + tag + ")"); } } return t; } /** * 打一个log * @param msg Message */ public static void log(String msg) { log(TAG, msg); } public static void log(Object tag, String msg) { log(tag == null ? TAG : tag.getClass().getSimpleName(), msg); } /** * 打一个log * @param tag Tag * @param msg Message */ public static void log(String tag, String msg) { Log.i(tag, msg); } }