Я был разработчиком Java в течение 2 лет.
Но я никогда не писал WeakReference в своем коде. Как использовать WeakReference, чтобы сделать мое приложение более эффективным, особенно приложение Android?
Я был разработчиком Java в течение 2 лет.
Но я никогда не писал WeakReference в своем коде. Как использовать WeakReference, чтобы сделать мое приложение более эффективным, особенно приложение Android?
Ответы:
Использование
WeakReference
в Android ничем не отличается от использования в простой старой Java. Вот отличное руководство, которое дает подробное объяснение: Понимание слабых ссылок .Вам следует подумать об его использовании всякий раз, когда вам нужна ссылка на объект, но вы не хотите, чтобы эта ссылка защищала объект от сборщика мусора. Классическим примером является кэш, который вы хотите собирать мусором, когда использование памяти становится слишком высоким (часто реализуется с помощью
WeakHashMap
).Обязательно проверьте
SoftReference
иPhantomReference
так же.РЕДАКТИРОВАТЬ: Том поднял некоторые проблемы по поводу реализации кеш с
WeakHashMap
. Вот статья с изложением проблем: WeakHashMap - это не кеш!Том прав, что были жалобы на плохую производительность NetBeans из-за
WeakHashMap
кэширования.Я до сих пор думаю, что было бы неплохо изучить кэш с помощью кеша,
WeakHashMap
а затем сравнить его с вашим собственным кешем, реализованным вручнуюSoftReference
. В реальном мире вы, вероятно, не использовали бы ни одно из этих решений, поскольку более разумно использовать стороннюю библиотеку, такую как Apache JCS .источник
WeakHashMap
используется как кеш фатально. Записи могут быть удалены, как только они созданы. Это, вероятно, не произойдет, когда вы тестируете, но вполне может быть при использовании. Следует отметить, что NetBeans может привести к 100% эффективной остановке ЦП.WeakHashMap
даже если вы правы, что это плохой выбор;)[EDIT2] Я нашел еще один хороший пример
WeakReference
. Обработка растровых изображений На странице « Поток пользовательского интерфейса» в разделе « Отображение растровых изображений» в учебном руководстве « Эффективно» показано одно использованиеWeakReference
AsyncTask.Это говорит,
Удачного кодирования!
[РЕДАКТИРОВАТЬ] Я нашел действительно хороший пример
WeakReference
из Facebook-Android-SDK . Класс ToolTipPopup - это не что иное, как простой класс виджетов, который показывает всплывающую подсказку над видом привязки. Я сделал снимок экрана.Класс действительно прост (около 200 строк) и заслуживает внимания. В этом классе
WeakReference
класс используется для хранения ссылки на представление привязки, что имеет смысл, так как позволяет привязке представления собирать мусор, даже когда экземпляр всплывающей подсказки живет дольше, чем его представление привязки.Удачного кодирования! :)
Позвольте мне поделиться одним рабочим примером
WeakReference
класса. Это небольшой фрагмент кода из виджета платформы AndroidAutoCompleteTextView
.Короче говоря,
WeakReference
класс используется для храненияView
объекта, чтобы предотвратить утечку памяти в этом примере.Я просто скопирую и вставлю класс PopupDataSetObserver, который является вложенным классом
AutoCompleteTextView
. Это действительно просто, и комментарии хорошо объясняют класс. Удачного кодирования! :)И
PopupDataSetObserver
используется в настройке адаптера.Одна последняя вещь. Я также хотел знать рабочий пример
WeakReference
приложения для Android, и я мог найти некоторые образцы в его официальных приложениях. Но я действительно не мог понять использование некоторых из них. Например, приложения ThreadSample и DisplayingBitmaps используютWeakReference
в своем коде, но после выполнения нескольких тестов я обнаружил, что метод get () никогда не возвращаетсяnull
, потому что ссылочный объект представления перерабатывается в адаптерах, а не собирается мусором.источник
Некоторые из других ответов кажутся неполными или слишком длинными. Вот общий ответ.
Как использовать WeakReference в Java и Android
Вы можете сделать следующие шаги:
WeakReference
переменнуюКод
MyClass
имеет слабую ссылку наAnotherClass
.AnotherClass
имеет сильную ссылку наMyClass
.Ноты
MyClass
был A иAnotherClass
был Б.WeakReference
является использование другого класса для реализации интерфейса. Это делается в шаблоне слушателя / наблюдателя .Практический пример
источник
// allow MyClass to get a weak reference to this class void someMethod() { mMyClass = new MyClass(); mMyClass.someMethod(this); }
??weakreference
объект вdoSomething
функции, чтобы не бытьnull
перед вызовомget
функции.«Канонизированное» отображение - это когда вы сохраняете один экземпляр рассматриваемого объекта в памяти, а все остальные ищут этот конкретный экземпляр с помощью указателей или некоторого такого механизма. Здесь слабые ссылки могут помочь. Краткий ответ: объекты WeakReference можно использовать для создания указателей на объекты в вашей системе, в то же время позволяя этим объектам утилизироваться сборщиком мусора после выхода из области видимости. Например, если бы у меня был такой код:
Любой объект, который я регистрирую, никогда не будет возвращен GC, потому что в наборе хранится ссылка на него
registeredObjects
. С другой стороны, если я сделаю это:Затем, когда GC захочет восстановить объекты в наборе, он сможет это сделать. Вы можете использовать эту технику для кэширования, каталогизации и т. Д. См. Ниже ссылки на более подробные обсуждения GC и кэширования.
Ссылка: сборщик мусора и WeakReference
источник