可分辨内存不足

时间:2018-03-06 09:46:31

标签: android parcelable

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

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

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

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

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

当然,我只能传递来自MyObject的ID并在DetailsActivity的{​​{1}}内进行另一次请求调用,但这需要用户等待几秒钟来加载数据。

任何建议或参考都是apreciated

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

实际上,您可以使用Application类来实现更好的目标

  1. 当您打算传递
  2. 时,在data课程中设置Application
  3. data
  4. 检索目的地的Application到本地变量
  5. data检索到本地变量后,将object中的Application设置为null
  6. 使用上述方法将确保您的对象内存在您使用它之后立即释放,而不会在整个应用程序生命周期中始终保留它