Android实现多次闪退清除数据

背景

很多时候由于后台返回的数据异常,可能会导致App闪退。而如果这些异常数据被App本地缓存下来,那么即使杀掉进程重新进入还是会发生闪退。唯一的解决方法就是清除App数据,但是用户可能没有这个意识或者嫌麻烦就直接不再使用了,这是我们无法接受的。在使用淘宝、追书神器等App时我发现有时候它们也会连续闪退,但是往往闪退三次后就恢复正常了,所以一般成熟的App都会做连续闪退三次后清除缓存数据的工作。而目前笔者搜不到有哪篇blog来讲这方面的事情,所以就姑且由我来讲讲此事,为希望提高App用户体验的朋友提供些许参考。

ACRA

为了能够在闪退的时候做一些事情,我们可以使用ACRA,这是Github上的一个开源项目,允许使用者设置一些Sender在App闪退的时候做一些事情。具体使用可以直接参考Github。如果不希望使用ACRA,那么也可以自己实现一个UncachedExceptionHandler并替换系统默认的Handler,并在这个Handler里面对数据进行处理。

实现清除数据

ACRA提供了自己的一些Sender,如使用系统邮件客户端向指定邮箱发送邮件的EmailIntentSender。而我们希望记录闪退次数和清除数据则需要implements ReportSender接口。

public class CrashHandler implements ReportSender { @Override public void send(Context context, CrashReportData errorContent) throws ReportSenderException { Timber.i("闪退,检查是否需要清空数据"); new CrashModel().checkAndClearData(); } } 

这里我们写了一个CrashModel用来记录闪退次数和时间决定是否需要清空数据,具体代码如下。 由于在ReportSender的时候无法打开其它线程,所以我们无法使用SharedPerferences来清理数据(打开SP的时候其实打开了一个新线程)。为此需要找到数据缓存的位置并将文件删除。同样道理,记录闪退时间也只能通过文件记录。当然,你可以选择一些文件不进行删除,如用户信息等不太容易出问题的数据。

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

转载于:https://www.cnblogs.com/dongweiq/p/5411875.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值