我在保留活动的捆绑数据时遇到问题。 某些内存清理程序(如清理主服务器(以及某些设备的 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来保持数据的活力,这些都不起作用。 但是,到目前为止,唯一实际有效的解决方案是将数据保存到本地存储(使用SharedPpreferences或InternalStorage(,这打开了其他数据管理的某些其他问题。 即使在保存数据后,应用程序的效果也就像在后退堆栈中导航时发生崩溃一样。
不幸的是,您将不得不使用某种形式的更永久的存储,例如文件或SQLite,因为这些"清理器"的全部意义在于回收正在使用的资源。
您可以选择将数据存储在云提供商(如 Firebase(中并请求它。Firebase 为您提供了 GB 的数据,用于存储在免费套餐上。不过这是开销,我强烈建议只使用文件或SQLite。这是您需要采用的最佳实践
无论如何,用户将这些清理器放在手机上都不是您的错,您只需要优雅地管理应用程序的生命周期即可
一种选择是禁用历史记录,以便用户无法导航后退堆栈。 另一种选择是始终确保数据在尝试显示数据之前加载到内存中,并在数据被过早擦除时显示错误消息。 您可以检测用户设备上安装的其他应用程序,并通知他们使用这些应用程序会使您的应用程序崩溃(但我不建议这样做,因为它会增加权限开销,这将减少愿意下载您的应用的人数(