【问题标题】:How to cache data for a certain time even after the app is killed?即使在应用程序被杀死后如何缓存数据一段时间?
【发布时间】:2019-12-02 07:59:09
【问题描述】:

我当然是安卓新手。

我正在构建一个新闻应用。我想在应用程序中添加缓存功能,例如 chrome for android(离线模式)和 Instagram。

应用程序的数据将通过服务器的 json 传输。所以我想要的是,应用程序从服务器请求数据以加载提要,并且数据被缓存,这样如果下次在没有互联网连接的情况下打开应用程序时,缓存的帖子就会显示出来(帖子的数量会受到限制) 最重要的是,用户查看的完整文章(通过单击提要中的帖子并在另一个活动中阅读整篇文章)也应该被缓存,这样缓存中最多有“n”个帖子时间,如果缓存被 n 个帖子填满,最后添加到缓存中的帖子将被删除,依此类推...

如何实现这种缓存? 与毕加索一样,每次应用程序被终止时缓存都会重置。 sharedPreferences 和 SQLite 是一种永久存储。

那么实现这种缓存的最佳方法是什么。有没有可以使用的库,或者我应该设法使用 sharedPreferences/SQLite/Storage 来做到这一点??

【问题讨论】:

    标签: android caching


    【解决方案1】:

    来自文档:

    如果您想暂时保留一些数据,而不是存储它 持久地,您应该使用特殊的缓存目录来保存 数据。 每个应用程序都有一个专用于这些应用程序的私有缓存目录 各种文件。当设备内部存储空间不足时, Android 可能会删除这些缓存文件以恢复空间。然而,你 不应依赖系统为您清理这些文件。你 应始终自己维护缓存文件并保持在 合理的空间消耗限制,例如 1MB。当用户 卸载您的应用,这些文件将被删除。

    如果你需要缓存一些文件,你应该使用 createTempFile()。例如,以下方法从 URL 中提取文件名,并在应用的内部缓存目录中创建一个具有该名称的文件:

    private File getTempFile(Context context, String url) {
        File file;
        try {
            String fileName = Uri.parse(url).getLastPathSegment();
            file = File.createTempFile(fileName, null, context.getCacheDir());
        } catch (IOException e) {
            // Error while creating file
        }
        return file;
    }
    

    使用 createTempFile() 创建的文件放置在您的应用专用的缓存目录中。您应该定期删除不再需要的文件。

    要读取现有文件,请调用 openFileInput(name),并传递文件名。

    您可以通过调用 fileList() 来获取所有应用程序文件名的数组。

    参考资料:
    Data and File Storage Overview
    Cache File Storage

    SharedPreferences 更适合键值对而不是转储 json。
    SQLite 适用于更大的数据库。

    • 内部文件存储:将应用程序私有文件存储在设备文件系统上
    • 外部文件存储:将文件存储在共享的外部文件系统中
    • 这通常用于共享的用户文件,例如照片。
    • SharedPreferences:将私有原始数据存储在键值对中。
    • 数据库:将结构化数据存储在私有数据库中。

    【讨论】:

    • 哇老兄!你解释得很好,消除了所有的疑虑。但是还有一件事,所以我是不是应该只做一个方法,每次打开文章时调用它?
    • 当您从api调用接收到json时,就像您提到的文章一样,您可以调用一个函数,将json保存在上述函数创建的临时文件中。然后当api调用失败时,调用一个函数从tempfile中读取数据并解析成json。
    • 您可以使用 FileInputStream 或 FileOutpuitStream 并在构造函数中传递 File 对象。确保以异步方式执行此操作(在异步任务等中),因为您不想在处理缓存时暂停您的应用程序。
    • 您在其他任何地方的 youtube/udemy 上是否有任何在线教程课程? ?我肯定想跟进。谢谢。
    • 我不知道有什么好的视频教程,但this answer 将为您提供最简单的文件读写解决方案:)
    【解决方案2】:

    根据您要存储的数据的大小,大概新闻提要历史将是大量数据,因此共享偏好可能不适合这种情况,我建议使用 Room Database。

    https://developer.android.com/training/data-storage/room/index.html

    【讨论】:

      【解决方案3】:

      如果您参考 android 生命周期,您最终会知道,一旦应用程序被杀死,它的实例或任何方法都不能在后台运行。

      要解决这个问题,您可以实现广播。

      https://developer.android.com/guide/components/broadcasts

      https://developer.android.com/guide/components/broadcast-exceptions

      如果您觉得本文对您有帮助,请点个赞!以便其他人知道正确答案!

      谢谢!

      【讨论】:

      • 广播如何帮助缓存?
      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多