假设我们有一个服务器请求的复杂对象(原语和其他对象)列表,以便在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
答案 0 :(得分:3)
正如您所经历的那样,通过捆绑/意图附加功能发送数据具有内存限制。
您可以选择将这些对象保留在内存中,并通过某些静态/单例实例访问它们,或者从您的服务器进行数据查询,以便在列表中显示它们。
另一个可行的选择是将数据存储在数据库中,并在需要时读取它,但这取决于您当前的架构......您可以查看Realm,Room,GreenDao数据库选项等...
答案 1 :(得分:0)
第二种方法更适合移动应用程序,因为您只通过在回收站视图中可见的API加载列表中的数据,您可以将该数据传递给活动,然后在活动中加载来自该特定项目的另一个调用的剩余数据。
我假设来自服务器的数据的每个对象的大小不同,导致某些但不是所有对象的内存不足。因此,更好的方法是修改服务器apt(如果可能),仅发送呼叫响应中列表所需的信息,并具有单独的资源URL以访问该对象的完整信息。
这可能会导致最小的延迟,但不会导致意外的内存不足错误,这对最终用户来说是一个很大的失望。
答案 2 :(得分:0)
实际上,您可以使用Application
类来实现更好的目标
data
课程中设置Application
data
Application
到本地变量
data
检索到本地变量后,将object
中的Application
设置为null
使用上述方法将确保您的对象内存在您使用它之后立即释放,而不会在整个应用程序生命周期中始终保留它