Android - храните данные в памяти с помощью WeakReference - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть простой 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 (этого следует избегать, перечислитеможет быть большим) + упростить доступ к данным между всеми действиями / фрагментами.

Правильный ли мой подход?Не уверен, не вызовет ли это неожиданное поведение или утечки памяти.

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

вы можете использовать общие настройки для хранения данных.я добавляю ссылку моего предыдущего ответа, это поможет вашему ответу посмотреть эту ссылку: - Обновление объекта, сохраненного в одном действии, из другого занятия

0 голосов
/ 16 апреля 2019

Рекомендую использовать SoftReference, лучше кешировать, объекты будут жить дольше. Что если GC удалит данные, которые вам действительно нужны? Объект WeakReference или SoftReference может быть удален GC в любое время.

0 голосов
/ 16 апреля 2019

Этот подход хорошо работает в случае меньшего количества данных, но когда большие объемы данных поступают в память в это время, приложение может не отвечать должным образом

...