通过内存清理器保留数据

时间:2018-10-19 10:55:31

标签: android android-activity viewmodel android-lifecycle

我在保存活动的捆绑数据时遇到问题。 某些内存清理器(例如clean master)以及某些设备的GC似乎从活动和相应的ViewModel中删除所有数据和捆绑数据,从而导致活动崩溃。

我的问题是:是否可以保存活动加载所需的数据(通常是通过捆绑发送)?

我已经尝试过尝试通过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),这会带来其他一些额外的数据管理问题。 即使保存了数据,应用程序的效果也像在通过后退堆栈进行导航时发生崩溃一样。

1 个答案:

答案 0 :(得分:1)

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

无论如何,用户将这些清洁剂放在手机上并不是您的错,您只需要优雅地管理应用程序的生命周期即可

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