package com.liwenzhi.asr.sqlitedemo.util;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.os.Process;
import android.text.TextUtils;
import android.util.Log;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.Locale;
/**
* Log管理类
*/
public final class LogUtil {
static final String TAG = "LogUtil";
static final int LEVEL_DEBUG = 1;
static final int LEVEL_INFO = 2;
static final int LEVEL_WARNING = 3;
static final int LEVEL_ERROR = 4;
static final int DBG_LEVEL = 1;//BuildConfig.DBG_LEVEL;
static final int MSG_SAVE_LOG = 1;
static final int MSG_SAVE_LOG_TICKER = 2;
static final int MSG_FORCE_SAVE_LOG = 3;
static final int MSG_DELETE_LOG_FILE = 4;
static final int MSG_DELETE_CRASH_LOG_FILE = 5;
static final int SAVE_LOG_TIMEOUT = 15 * 1000; //15s
static final int MAX_LOG_FILE_NUM = 5;
static final int MAX_LOG_FILE_SIZE = 5 * 1024 * 1024; //5M
static final int MAX_CRASH_LOG_FILE_NUM = 20;
static final int LOG_FILE_CACHE = 32 * 1024; //32K
static final String LOG_FILE_NAME_PREFIX = "log";
static final String LOG_DIR_PREFIX = "/sdcard/robotmobile/";
static final String LOG_SAVE_DIR = LOG_DIR_PREFIX + "debug/";
static final String LOG_DIR = LOG_SAVE_DIR + "log/" + Utils.getProcName();
public static final String CRASH_DIR = LOG_SAVE_DIR + "crash/" + Utils.getProcName();
private static String APP_TAG = "Unknown";
private static boolean mSaveLog = false;
private static Handler sHandler;
private static HandlerThread sHandlerThread;
private static StringBuffer sLogBuffer = new StringBuffer();
static final SimpleDateFormat SDF = new SimpleDateFormat("yyyyMMdd HH:mm:ss:SSS");
static final SimpleDateFormat SDF_CRASH = new SimpleDateFormat("yyyyMMdd_HH-mm-ss-SSS");
static {
sHandlerThread = new HandlerThread("LogUtil");
sHandlerThread.start();
sHandler = new Handler(sHandlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
doHandleMessage(msg);
}
};
checkLogFileNum();
checkCrashLogFileNUm();
sHandler.sendEmptyMessageDelayed(MSG_SAVE_LOG_TICKER, SAVE_LOG_TIMEOUT);
}
public static void updateSaveLog(boolean saveLog) {
mSaveLog = saveLog;
}
public static void setAppTag(String appTag) {
APP_TAG = appTag;
}
public static void d(String tag, String message) {
if(LEVEL_DEBUG >= DBG_LEVEL) {
logInner(LEVEL_DEBUG, tag, message);
}
}
public static void i(String tag, String message) {
if(LEVEL_INFO >= DBG_LEVEL) {
logInner(LEVEL_INFO, tag, message);
}
}
public static void w(String tag, String message) {
if(LEVEL_WARNING >= DBG_LEVEL) {
logInner(LEVEL_WARNING, tag, message);
}
}
public static void e(String tag, String message) {
if(LEVEL_ERROR >= DBG_LEVEL) {
logInner(LEVEL_ERROR, tag, message);
}
}
private static void logInner(int level, String tag, String message) {
if(message == null) {
return;
}
switch (level) {
case LEVEL_DEBUG:
Log.d(APP_TAG + "-" + tag, message);
break;
case LEVEL_INFO:
Log.i(APP_TAG + "-" + tag, message);
break;
case LEVEL_WARNING:
Log.w(APP_TAG + "-" + tag, message);
break;
case LEVEL_ERROR:
Log.e(APP_TAG + "-" + tag, message);
break;
default:
throw new IllegalArgumentException("logInner: invalid log level=" + level);
}
saveLog(APP_TAG + "-" + tag, message);
}
private static void checkLogFileNum() {
File dir = new File(LOG_DIR);
String[] files = dir.list();
if(files != null && files.length > MAX_LOG_FILE_NUM) {
sHandler.sendEmptyMessage(MSG_DELETE_LOG_FILE);
}
}
public static void checkCrashLogFileNUm() {
File dir = new File(CRASH_DIR);
String[] files = dir.list();
if(files != null && files.length > MAX_CRASH_LOG_FILE_NUM) {
sHandler.sendEmptyMessage(MSG_DELETE_CRASH_LOG_FILE);
}
}
public static synchronized void flushLog() {
sHandler.sendEmptyMessage(MSG_FORCE_SAVE_LOG);
}
private static synchronized void saveLog(String tag, String message) {
if(mSaveLog) {
StringBuffer sb = new StringBuffer();
sb.append(getTime(System.currentTimeMillis())).append(" ").append(Process.myPid()).append(" ").append(Process.myTid())
.append(" ").append(tag).append(": ").append(message).append('\n');
Message msg = sHandler.obtainMessage(MSG_SAVE_LOG);
msg.obj = sb.toString();
sHandler.sendMessage(msg);
}
}
private static void doHandleMessage(Message msg) {
switch (msg.what) {
case MSG_SAVE_LOG:
if(msg.obj != null) {
//sHandler.removeMessages(MSG_SAVE_LOG_TICKER);
//sHandler.sendEmptyMessageDelayed(MSG_SAVE_LOG_TICKER, SAVE_LOG_TIMEOUT);
doSaveLog((String) msg.obj, false);
}
break;
case MSG_SAVE_LOG_TICKER:
sHandler.sendEmptyMessageDelayed(MSG_SAVE_LOG_TICKER, SAVE_LOG_TIMEOUT);
doSaveLog(null, true);
break;
case MSG_FORCE_SAVE_LOG:
Log.i(TAG, "MSG_FORCE_SAVE_LOG");
sHandler.removeMessages(MSG_SAVE_LOG_TICKER);
sHandler.sendEmptyMessageDelayed(MSG_SAVE_LOG_TICKER, SAVE_LOG_TIMEOUT);
doSaveLog(null, true);
break;
case MSG_DELETE_LOG_FILE:
deleteLogFile();
break;
case MSG_DELETE_CRASH_LOG_FILE:
deleteCrashLogFile();
break;
default:
break;
}
}
private static void deleteLogFile() {
Log.d(TAG, "deleteLogFile");
String[] files = new File(LOG_DIR).list();
if(files != null) {
for(int i = MAX_LOG_FILE_NUM + 1; i <= files.length; i++) {
File f = new File(LOG_DIR, LOG_FILE_NAME_PREFIX + "." + i);
f.delete();
}
}
}
private static void deleteCrashLogFile() {
Log.d(TAG, "deleteCrashLogFile");
File[] files = new File(CRASH_DIR).listFiles();
if(files != null) {
Arrays.sort(files, new Comparator<File>() {
@Override
public int compare(File f1, File f2) {
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
}
});
//一次性删除最早的10个crash日志文件
for(int i = 0; i < 10; i++) {
files[i].delete();
}
}
}
public static String getTime(long time) {
String str = SDF.format(new Date(time));
return str;
}
public static String getCrashTime(long time) {
String str = SDF_CRASH.format(new Date(time));
return str;
}
private static synchronized void doSaveLog(String log, boolean force) {
//Log.d(TAG, "doSaveLog: force=" + force);
if(!TextUtils.isEmpty(log)) {
sLogBuffer.append(log);
没有合适的资源?快使用搜索试试~ 我知道了~
ContentProvider实现数据库操作
共85个文件
xml:31个
png:13个
java:12个
需积分: 50 33 下载量 112 浏览量
2018-11-01
00:27:56
上传
评论 1
收藏 1.2MB ZIP 举报
温馨提示
本示例结合ContentProvider实现了数据库的增删改查操作 并且扩展性比较好
资源推荐
资源详情
资源评论
收起资源包目录
SQLiteDemo.zip (85个子文件)
SQLiteDemo
.gitignore 127B
查询单个数据.png 141KB
显示界面.png 76KB
app
.gitignore 8B
build.gradle 725B
src
androidTest
java
com
liwenzhi
asr
sqlitedemo
ExampleInstrumentedTest.java 781B
main
AndroidManifest.xml 884B
res
mipmap-xhdpi
ic_launcher_round.png 7KB
ic_launcher.png 4KB
mipmap-mdpi
ic_launcher_round.png 3KB
ic_launcher.png 2KB
layout
item_people_info.xml 2KB
activity_main.xml 1KB
mipmap-xxhdpi
ic_launcher_round.png 10KB
ic_launcher.png 6KB
drawable
ic_launcher_background.xml 6KB
mipmap-anydpi-v26
ic_launcher_round.xml 276B
ic_launcher.xml 276B
drawable-v24
ic_launcher_foreground.xml 2KB
mipmap-hdpi
ic_launcher_round.png 5KB
ic_launcher.png 3KB
mipmap-xxxhdpi
ic_launcher_round.png 15KB
ic_launcher.png 9KB
values
strings.xml 76B
colors.xml 214B
styles.xml 394B
java
com
liwenzhi
asr
sqlitedemo
manager
DataManager.java 3KB
provider
DBOpenHelper.java 2KB
SqliteProvider.java 5KB
table
PeopleInfoTable.java 2KB
util
LogUtil.java 10KB
Utils.java 4KB
FileUtil.java 4KB
bean
PeopleInfo.java 2KB
activity
MainActivity.java 3KB
adapter
PeopleInfoAdapter.java 2KB
test
java
com
liwenzhi
asr
sqlitedemo
ExampleUnitTest.java 421B
libs
proguard-rules.pro 772B
app.iml 10KB
settings.gradle 16B
build.gradle 573B
gradlew 5KB
SQLiteDemo.iml 864B
gradlew.bat 2KB
.gradle
4.1
javaCompile
taskJars.bin 20KB
taskHistory.bin 400KB
classAnalysis.bin 772KB
jarAnalysis.bin 305KB
javaCompile.lock 17B
fileContent
fileContent.lock 17B
fileHashes
fileHashes.bin 241KB
fileHashes.lock 17B
resourceHashesCache.bin 19KB
taskHistory
fileSnapshots.bin 2.41MB
taskHistory.bin 64KB
taskHistory.lock 17B
fileChanges
last-build.bin 1B
buildOutputCleanup
built.bin 0B
cache.properties.lock 2B
cache.properties 51B
.idea
misc.xml 2KB
encodings.xml 200B
libraries
com_android_support_support_media_compat_26_1_0.xml 722B
org_hamcrest_hamcrest_core_1_3_jar.xml 543B
com_android_support_appcompat_v7_26_1_0.xml 682B
com_android_support_support_annotations_26_1_0_jar.xml 608B
com_android_support_animated_vector_drawable_26_1_0.xml 742B
com_android_support_support_core_utils_26_1_0.xml 712B
com_android_support_support_compat_26_1_0.xml 692B
android_arch_lifecycle_common_1_0_0_jar.xml 548B
com_android_support_support_fragment_26_1_0.xml 702B
junit_junit_4_12_jar.xml 487B
android_arch_lifecycle_runtime_1_0_0.xml 658B
android_arch_core_common_1_0_0_jar.xml 533B
com_android_support_support_core_ui_26_1_0.xml 697B
com_android_support_support_v4_26_1_0.xml 672B
com_android_support_support_vector_drawable_26_1_0.xml 737B
workspace.xml 192KB
gradle.xml 626B
runConfigurations.xml 564B
modules.xml 357B
gradle
wrapper
gradle-wrapper.properties 236B
gradle-wrapper.jar 52KB
添加数据后.png 98KB
local.properties 498B
共 85 条
- 1
资源评论
峥嵘life
- 粉丝: 2532
- 资源: 114
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功