【问题标题】:Android - hold data in memory with WeakReferenceAndroid - 使用 Wea​​kReference 将数据保存在内存中
【发布时间】:2019-04-16 10:22:24
【问题描述】:

我有简单的DataHolder 类:

public class DataHolder
{
    private static final DataHolder holder = new DataHolder();
    Map<String, WeakReference<Object>> data = new HashMap<>();

    public static DataHolder getInstance() {return holder;}

    public void save(String id, Object object)
    {
        data.put(id, new WeakReference<>(object));
    }

    public Object retrieve(String id)
    {
        WeakReference<Object> objectWeakReference = data.get(id);
        return objectWeakReference.get();
    }
}

基本上,我想保存一些数据以在其他任何地方检索它们(例如,其他活动或片段)。

保存:

DataHoler.getInstance().save("list", myList);

要检索数据:

List<MyObject> list = (ArrayList) DataHoler.getInstance().retrieve("list");

我的目的是避免使用 parcelable 传递大量数据(应该避免这种情况,列表可能很大)+ 简化所有活动/片段之间对数据的访问。

我的方法正确吗?不确定它是否会导致任何意外行为或内存泄漏。

【问题讨论】:

    标签: java android memory-leaks weak-references


    【解决方案1】:

    这种方法在数据较少的情况下效果很好,但是当数据量很大时 在那个时候进入内存应用可能无法正确响应

    【讨论】:

    • 什么是“大”?例如,列表包含 1000 个对象,每个对象 10 个字段。
    【解决方案2】:

    您可以使用共享偏好来存储数据。我正在添加我之前答案的链接,这将有助于您的答案查看此链接:- Updating an object stored in one Activity from another activity

    【讨论】:

    • 这会很慢
    • 为什么这么慢?
    • 磁盘缓存,尤其是在共享首选项中,对于大数据来说非常慢。
    • 共享首选项不适用于大数据,它用于单次小数据,如果您想存储大量数据,那么您可以在应用中创建 RoomDatabse 或连接服务器
    • 是的,RoomDatabase 很好,但是它太大了,只能将列表传递给另一个活动。而且还是会比内存缓存慢+实现复杂
    【解决方案3】:

    我推荐使用 SoftReference,它更适合缓存,对象的寿命会更长。如果 GC 删除了您实际需要的数据怎么办? WeakReference 或 SoftReference 对象可以随时被 GC 移除。

    【讨论】:

    • 在这种情况下GC不会知道是否需要数据吗?
    • 解决方案取自:stackoverflow.com/questions/4878159/… 据我了解,只要创建数据的活动存在,GC 就不应删除它。这应该在活动销毁后进行垃圾收集。
    猜你喜欢
    • 2018-11-02
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多