public class CrashHandler implements ReportSender {
@Override
public void send(Context context, CrashReportData errorContent) throws ReportSenderException {
Timber.i("闪退,检查是否需要清空数据");
new CrashModel().checkAndClearData();
}
}
public class CrashModel {
private static final String KEY_CRASH_TIMES = "crash_times";
private static final String CRASH_TIME_FILE_NAME = "crash_time";
//不能通过App.getPackageName来获取包名,否则会有问题,只能默认为cn.campusapp.campus。所以对于debug或者运营版本,清数据会把release的清掉
private static final String FILE_DIR = String.format("/data/data/%s/", BuildConfig.APPLICATION_ID);
private static final String ACCOUNT_FILE_NAME = String.format("%s%s", FILE_DIR, "shared_prefs/account_pref.xml");
private static ArrayList<String> FILES_DONTNEED_DELETE = new ArrayList<>(); //该目录中的文件不会被删除
static {
FILES_DONTNEED_DELETE.add(ACCOUNT_FILE_NAME); //目前账号信息文件不会被删除,但是会手动改变数据,只保留userId accessToken 和school
}
protected ArrayList<Long> mCrashTimes;
Gson gson = new Gson();
private File mFileDir;
public CrashModel() {
mFileDir = new File(FILE_DIR);
mCrashTimes = readCrashTimes();
if (mCrashTimes == null) {
mCrashTimes = new ArrayList<>();
storeCrashTimes(mCrashTimes);
}
}
public void checkAndClearData() {
long timeNow = System.currentTimeMillis();
if (checkClearData(timeNow, new ArrayList<>(mCrashTimes))) {
Timber.i("已经在5分钟之内有三次闪退,需要清理数据");
try {
clearData();
} catch (Exception e) {
Timber.e(e, "清空所有数据失败");
}
} else {
mCrashTimes.add(timeNow);
storeCrashTimes(mCrashTimes);
Timber.i("此次不需要清空数据, %s", gson.toJson(mCrashTimes));
}
}
private void storeCrashTimes(ArrayList<Long> crashTimes) {
try {
String str = gson.toJson(crashTimes);
Files.writeToFile(mFileDir, CRASH_TIME_FILE_NAME, str);
} catch (Exception e) {
Timber.e(e, "保存闪退时间失败");
}
}
private ArrayList<Long> readCrashTimes() {
try {
String timeStr = Files.readFileContent(mFileDir, CRASH_TIME_FILE_NAME);
return gson.fromJson(timeStr, new TypeToken<ArrayList<Long>>() {
}.getType());
} catch (Exception e) {
Timber.e(e, "读取闪退时间失败");
}
return null;
}
/**
* 检查是否需要清空数据,目前的清空策略是在5分钟之内有三次闪退的就清空数据,也就是从后往前遍历,只要前两次闪退发生在5分钟之内,就清空数据
*
* @return
*/
private boolean checkClearData(long time, ArrayList<Long> crashTimes) {
Timber.i(gson.toJson(crashTimes));
int count = 0;
for (int i = crashTimes.size() - 1; i >= 0; i--) {
long crashTime = crashTimes.get(i);
if (time - crashTime <= 5 * 60 * 1000) {
count++;
if (count >= 2) {
break;
}
}
}
if (count >= 2) {
//在5分钟之内有三次闪退,这时候需要清空数据
return true;
} else {
return false;
}
}
/**
* 清空数据,包括数据库中的和SharedPreferences中的
*
* @throws Exception
*/
private void clearData() throws Exception {
Timber.i("开始清理数据");
Files.deleteFilesExceptSomeInDirectory(mFileDir, FILES_DONTNEED_DELETE);
}
}
@ReportsCrashes(
//一些ACRA的设置,具体参考ACRA文档,因为我们使用自定义Sender,所以这里完全可以不用设置
//mailTo = "bugs@treeholeapp.cn",
//mode = ReportingInteractionMode.TOAST,
//resToastText = R.string.crash_toast_text
)
public class App extends Application {
@Override
public void onCreate() {
if (!BuildConfig.DEBUG) { //这里我判断只有在非DEBUG下才清除数据,主要是为了在开发过程中能够保留线程。
ACRA.init(APPLICATION_CONTEXT);
CrashHandler handler = new CrashHandler();
ACRA.getErrorReporter().setReportSender(handler); //在闪退时检查是否要清空数据
}
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有