iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android实现多次闪退清除数据
  • 245
分享到

Android实现多次闪退清除数据

数据Android 2022-06-06 08:06:43 245人浏览 八月长安
摘要

很多时候由于后台返回的数据异常,可能会导致App闪退。而如果这些异常数据被App本地缓存下来,那么即使杀掉进程重新进入还是会发生闪退。唯一的解决方法就是清除App数据,但是用户

很多时候由于后台返回的数据异常,可能会导致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(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;
  }
  
  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;
    }
  }
  
  private void clearData() throws Exception {
    Timber.i("开始清理数据");
    Files.deleteFilesExceptSomeInDirectory(mFileDir, FILES_DONTNEED_DELETE);
  }
}

然后我们需要将CrashHandler 添加到ACRA的异常处理Sender列表中。在你的Application类中添加如下代码。


@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); //在闪退时检查是否要清空数据
    }
  }
}

总结
以上即为实现多次闪退后清除数据的实现,希望大家开发的App Bug越来越少。

您可能感兴趣的文章:Android 清除SharedPreferences 产生的数据(实例代码)android开发教程之清除android数据缓存示例(清除本地数据缓存)Android系统设置中的清除数据会清除哪些数据?Android实现分享微信好友及出现闪退的解决办法Android去除烦人的默认闪退Dialog


--结束END--

本文标题: Android实现多次闪退清除数据

本文链接: https://www.lsjlt.com/news/25254.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • delphi stringgrid清除数据怎么实现
    要清除 Delphi StringGrid 中的数据,可以使用以下方法之一:1. 使用循环逐行逐列遍历 StringGrid,将每个...
    99+
    2024-02-29
    delphi
  • pandas数据清洗如何实现删除
    这篇文章主要介绍“pandas数据清洗如何实现删除”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“pandas数据清洗如何实现删除”文章能帮助大家解决问题。准备工作(导入库、导入数据)import&n...
    99+
    2023-07-02
  • Android studio怎么清除数据和缓存
    可以通过以下步骤清除 Android Studio 的数据和缓存: 打开 Android Studio 点击 "File" 菜单选择 "Invalidate Caches / Restart"在弹出的对话框中选择 "Invalidate...
    99+
    2023-09-10
    android studio android 缓存 ide gradle
  • android中bindservice多次调用怎么实现
    在Android中,可以通过以下步骤实现多次调用bindService: 创建一个ServiceConnection对象,用于监听...
    99+
    2024-02-29
    android
  • pandas数据清洗实现删除的项目实践
    目录准备工作(导入库、导入数据)检测数据情况DataFrame.drop(labels=None,axis=0, index=None, columns=None, inp...
    99+
    2024-04-02
  • 永久删除数据:Discuz数据清除最佳实践
    永久删除数据:Discuz数据清除最佳实践 在使用Discuz等论坛系统过程中,经常会遇到需要删除数据的情况。无论是清理过期数据,还是对某些敏感信息进行永久删除,在处理数据清除时都需要...
    99+
    2024-03-11
    最佳实践 数据清除 删除数据
  • Android怎么实现按两次返回键退出程序
    小编给大家分享一下Android怎么实现按两次返回键退出程序,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Android 实现按两次返回键退出程序(两种方法)第一...
    99+
    2023-05-30
    android
  • 数据库中如何使用闪回删除来回退DROP TABLE操作
    这篇文章主要为大家展示了“数据库中如何使用闪回删除来回退DROP TABLE操作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据库中如何使用闪回删除来...
    99+
    2024-04-02
  • vue项目退出登录清除store数据的三种方法
    目录方法一:(不友好,页面会白屏,不推荐使用)方法二 : (不会出现白屏,推荐使用)方法三 : vuex清除token (不会出现白屏,推荐使用)总结方法一:(不...
    99+
    2024-04-02
  • Android彻底清除APP数据的两种方案总结
    目录用途方案一:利用命令行pm clear 包名,系统级别清除App数据优点缺点代码方案二:手动删除内部储存和外部储存优点缺点代码总结用途 用于APP内部的重置功能实现。 方案一:...
    99+
    2024-04-02
  • 使用Mybatis如何实现删除多个数据
    目录Mybatis删除多个数据删除数据库中sid=1和sid=2的数据操作步骤如下Mybatis批量删除多表数据业务需求查询以obj_前缀开头的表的截断语句Mybatis删除多个数据...
    99+
    2024-04-02
  • C#中Datagridview选中多行数据删除实现
    您可以使用以下代码来实现C#中DataGridView选中多行数据删除的功能:```csharpprivate void btnDe...
    99+
    2023-09-26
    C#
  • Oracle 闪回 找回数据的实现方法
    闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成)。需要注意的是,闪回技术旨在快速恢复逻辑错误,对...
    99+
    2024-04-02
  • Python怎么实现数据清洗
    本文小编为大家详细介绍“Python怎么实现数据清洗”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python怎么实现数据清洗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。这里数据清洗需要用到的库是pandas...
    99+
    2023-07-06
  • Python如何实现数据清洗
    小编给大家分享一下Python如何实现数据清洗,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!数据清洗小工具箱在下面的代码片段中,数据清洗代码被封装在了一些函数中,代码的目的十分直观。你可以直接使用这些代码,无需将它们嵌入到...
    99+
    2023-06-28
  • 利用Java实现求字符串中出现次数最多的字符及次数
    这篇文章将为大家详细讲解有关利用Java实现求字符串中出现次数最多的字符及次数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。此题的解题思路如下:引入TreeSet:通过集合快速找到所有出现过...
    99+
    2023-05-31
    java 字符串 ava
  • 如何实现MySQL中删除多行数据的语句?
    如何实现MySQL中删除多行数据的语句?在MySQL中,删除多行数据是非常常见的数据库操作之一。当我们需要删除数据库表中的多行数据时,可以使用DELETE语句来实现。DELETE语句可以根据指定的条件删除符合条件的多行数据。下面将通...
    99+
    2023-11-08
    数据库 多行数据 删除语句
  • 如何使用Mybatis如何实现删除多个数据
    这篇文章将为大家详细讲解有关如何使用Mybatis如何实现删除多个数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Mybatis删除多个数据例如:删除数据库中sid=1和sid=2的数据操作步骤如下1....
    99+
    2023-06-29
  • vue中怎么使用localStorage实现在界面刷新时清除数据
    本篇文章为大家展示了vue中怎么使用localStorage实现在界面刷新时清除数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。vue中使用方法:1、新建一个st...
    99+
    2024-04-02
  • SQLServer中怎么实现层次数据查询
    SQLServer中怎么实现层次数据查询,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  SQLServer2000层次数据查询的实现方法...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作