【问题标题】:Preserve data through memory cleaners通过内存清理器保存数据
【发布时间】:2018-10-19 10:55:31
【问题描述】:

我对保留 Activity 的捆绑数据有疑问。 某些内存清理器(例如 clean master)以及某些设备的 GC 似乎会从 Activity 和相应的 ViewModel 中删除所有数据和捆绑数据,从而导致 Activity 崩溃。

我的问题是:有没有办法保存加载活动所需的数据(通常通过包传递)?

我已尝试通过 onSavedInstanceState 尝试保存数据的解决方案

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(BUNDLE_ARGUMENT_CUSTOMER_ID, this.mViewModel.getCustomer().getId());

    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    if (savedInstanceState != null) {
        this.mViewModel.setCustomer(new Customer(savedInstanceState.getInt(BUNDLE_ARGUMENT_CUSTOMER_ID, -1)));
    }
}

除了依靠 ViewModel 来保持数据活跃之外,这些都没有奏效。 然而,目前唯一可行的解​​决方案是将数据保存到本地存储(使用SharedPreferenceInternalStorage),这会引发其他数据管理问题。 即使保存数据后,应用程序的效果就像在返回堆栈导航时发生了崩溃一样。

【问题讨论】:

    标签: android android-activity viewmodel android-lifecycle


    【解决方案1】:

    不幸的是,您将不得不使用某种形式的更永久的存储,例如文件或 SQLite,因为这些“清理程序”的全部目的是回收正在使用的资源。
    您可以选择将数据存储在云提供商(如 firebase)中并请求它。 firebase 为您提供了存储在免费层上的 gb 数据。虽然这是开销,但我强烈建议只使用文件或 SQLite。这是您需要采用的最佳做法

    无论如何,用户将这些清洁器放在他们的手机上并不是你的错,你只需要优雅地管理应用的生命周期

    一个选项是禁用历史记录,这样用户就无法导航回堆栈。另一种选择是在尝试显示数据之前始终确保将数据加载到内存中,并在数据被过早擦除的情况下显示错误消息。您可以检测到用户设备上安装的其他应用程序并通知他们使用这些应用程序会使您的应用程序崩溃(但我不建议这样做,因为它会增加权限开销,从而减少愿意下载您的应用程序的人数)

    【讨论】:

    • 感谢您的反馈。目前我正在寻找一种替代方案,因为使用本地数据存储会在应用程序的当前状态下增加大量开发时间,并且如果从存储或捆绑包中加载数据等我'必须以某种方式处理。
    • 使用 json 文件将 sharedpreference 键值对存储为 json 是一种具有最小开发开销的选项。
    • 我已经有类似的系统,所以存储中的数据格式不会造成问题。我的问题是关于使用永久存储的替代方法。
    • 没有移动操作系统可以让你这样存储数据。最接近的是stickybroadcast,但即使这样也已被弃用,强烈建议不要这样做。只需将其视为使用移动堆栈的代价
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多