首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过内存清理器保存数据

通过内存清理器保存数据
EN

Stack Overflow用户
提问于 2018-10-19 10:55:31
回答 1查看 58关注 0票数 2

我对保存一个活动的捆绑数据有一个问题。某些内存清理器(例如清洁主)以及某些设备的GC似乎从一个活动和相应的ViewModel中删除了所有数据,并将数据捆绑在一起,从而导致活动崩溃。

,我的问题是:是否有一种方法可以保存加载活动所需的数据(通常通过包传递)?

我尝试了一些解决方案,试图通过onSavedInstanceState保存数据。

代码语言:javascript
复制
@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),这会打开数据附加管理的某些其他问题。即使在保存数据之后,应用程序的效果就好像在导航通过后台堆栈时发生了崩溃一样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-19 11:20:26

不幸的是,您将不得不使用某种形式的更永久的存储,如文件或SQLite,因为这些“清洁工”的全部目的是回收正在使用的资源。

您可以选择将数据存储在云提供商(如firebase)中并请求它。firebase为您提供一个gb的数据存储在免费的层上。不过,这是开销,我强烈建议只使用文件或SQLite。这是你需要采用的最佳实践

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52890990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档