可分辨内存不足

问题描述 投票:0回答:3

假设我们有一个服务器请求的复杂对象(原语和其他对象)的列表,以便在RecycleView中显示它们。在适配器中,我们只需要来自每个对象的一些数据,比方说70%。

我从服务器列表中获取了完整的数据对象,并且每个对象都实现了Parcelable,因此当我选择一个项目时,我通过意图将对象传递给MyDetailsActivity,如下所示:

Intent intent = new Intent(context, MyDetailsActivity.class);
intent.putExtra("foo", myComplexObject);
startActivity(intent);

这是按预期工作的,但在一些低内存设备上,我出现了内存错误。所以我的问题是如何实现这种类型的数据流?

一个可能的解决方案是在MyObj类中实现Applicattion的get / set,并将其传递给它,但我不确定它是否稳定。

当然,我可以从MyObject传递一个id,并在DetailsActivityonCreate()中进行另一个请求调用,但这需要用户等待几秒钟才能加载数据。

任何建议或参考表示赞赏

android parcelable
3个回答
3
投票

正如您所经历的那样,通过捆绑/意图附加功能发送数据具有内存限制。

您可以选择将这些对象保留在内存中,并通过某些静态/单例实例访问它们,或者从您的服务器进行数据查询,以便在列表中显示它们。

另一个可行的选择是将数据存储在数据库中,并在需要时读取它,但这取决于您当前的架构......您可以查看Realm,Room,GreenDao数据库选项等...


0
投票

第二种方法更适合移动应用程序,因为您只通过在回收站视图中可见的API加载列表中的数据,您可以将该数据传递给活动,然后在活动中加载来自该特定项目的另一个调用的剩余数据。

我假设来自服务器的数据的每个对象的大小不同,导致某些但不是所有对象的内存不足。因此,更好的方法是修改服务器apt(如果可能),仅发送呼叫响应中列表所需的信息,并具有单独的资源URL以访问该对象的完整信息。

这可能会导致最小的延迟,但不会导致意外的内存不足错误,这对最终用户来说是一个很大的失误。


0
投票

你可以实际使用Application类来达到这个目的,使它更好

  1. 如果您打算通过,请在data班级设置Application
  2. data将目的地的Application检索到Local变量
  3. data检索到局部变量后,将object中的Application设置为null

使用上述方法将确保您的对象内存在您使用它之后立即释放,而不会在整个应用程序生命周期中始终保持它

© www.soinside.com 2019 - 2024. All rights reserved.