简体   繁体   English

Android - 使用WeakReference在内存中保存数据

[英]Android - hold data in memory with WeakReference

I have simple DataHolder class: 我有简单的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();
    }
}

Basically, I want to hold some data to retrieve them anywhere else (for example, other activity or fragment). 基本上,我想保留一些数据以在其他地方检索它们(例如,其他活动或片段)。

To save: 要保存:

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

To retrieve data: 要检索数据:

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

My intent is to avoid passing large amount of data with parcelable (this should be avoided, list may be large) + simplify access to data between all activities/fragments. 我的意图是避免使用parcelable传递大量数据(这应该避免,列表可能很大)+简化所有活动/片段之间的数据访问。

Is my approach correct? 我的方法是否正确? Not sure if it won't cause any unexpected behaviours or memory leaks. 不确定它是否会导致任何意外行为或内存泄漏。

这种方法在数据较少的情况下运行良好,但是当大量数据进入内存时,app可能无法正常响应

you can use shared preference to store data. 您可以使用共享首选项来存储数据。 i am adding a link of my previous answer it will be help your answer look this link :- Updating an object stored in one Activity from another activity 我正在添加我之前回答的链接,这将有助于您的答案看到此链接: - 从另一个活动更新存储在一个活动中的对象

I recommend using SoftReference, it is better for caching, objects will live longer. 我建议使用SoftReference,它更适合缓存,对象会活得更久。 What if GC removes data which you actually needed? 如果GC删除您实际需要的数据怎么办? WeakReference or SoftReference object can be removed by GC anytime. 可以随时通过GC删除WeakReference或SoftReference对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM