He sido desarrollador de Java durante 2 años.
Pero nunca he escrito una WeakReference en mi código. ¿Cómo usar WeakReference para hacer que mi aplicación sea más eficiente, especialmente la aplicación de Android?
java
android
weak-references
Chris
fuente
fuente
Respuestas:
Usar un
WeakReference
en Android no es diferente de usar uno en Java antiguo. Aquí hay una gran guía que brinda una explicación detallada: Comprender las referencias débiles .Debería pensar en usar uno cada vez que necesite una referencia a un objeto, pero no desea que esa referencia proteja el objeto del recolector de basura. Un ejemplo clásico es un caché en el que desea recolectar basura cuando el uso de memoria es demasiado alto (a menudo implementado con
WeakHashMap
).Asegúrese de revisar
SoftReference
yPhantomReference
también.EDITAR: Tom ha planteado algunas preocupaciones sobre la implementación de un caché con
WeakHashMap
. Aquí hay un artículo que presenta los problemas: WeakHashMap no es un caché!Tom tiene razón en que ha habido quejas sobre el bajo rendimiento de Netbeans debido a
WeakHashMap
almacenamiento caché.Todavía creo que sería una buena experiencia de aprendizaje implementar un caché
WeakHashMap
y luego compararlo con su propio caché enrollado a mano implementadoSoftReference
. En el mundo real, probablemente no usaría ninguna de estas soluciones, ya que tiene más sentido usar una biblioteca de terceros como Apache JCS .fuente
WeakHashMap
usado como caché es fatal. Las entradas se pueden eliminar tan pronto como se crean. Esto probablemente no sucederá cuando esté realizando la prueba, pero puede ocurrir cuando esté en uso. Es de destacar que NetBeans puede llegar a una parada efectiva del 100% de la CPU con esto.WeakHashMap
incluso si usted es correcto, es una mala elección;)[EDIT2] Encontré otro buen ejemplo de
WeakReference
. Procesar mapas de bits fuera de la página de subprocesos de la interfaz de usuario en la guía de capacitación Visualización eficiente deWeakReference
mapas de bits , muestra un uso de AsyncTask.Dice,
¡Feliz codificación!
[EDIT] me encontré con un muy buen ejemplo de
WeakReference
desde facebook-android-sdk . La clase ToolTipPopup no es más que una clase de widget simple que muestra información sobre herramientas sobre la vista de anclaje. Capturé una captura de pantalla.La clase es realmente simple (alrededor de 200 líneas) y digna de ver. En esa clase,
WeakReference
clase se usa para mantener referencia a la vista de anclaje, lo que tiene mucho sentido, ya que hace posible que la vista de anclaje se recolecte basura incluso cuando una instancia de información sobre herramientas dura más que su vista de anclaje.¡Feliz codificación! :)
Permítanme compartir un ejemplo
WeakReference
práctico de clase. Es un pequeño fragmento de código del widget de marco de Android llamadoAutoCompleteTextView
.En resumen, la
WeakReference
clase se usa para contenerView
objetos para evitar pérdidas de memoria en este ejemplo.Copiaré y pegaré la clase PopupDataSetObserver, que es una clase anidada de
AutoCompleteTextView
. Es realmente simple y los comentarios explican bien la clase. ¡Feliz codificación! :)Y
PopupDataSetObserver
se usa para configurar el adaptador.Una última cosa. También quería saber ejemplos de trabajo
WeakReference
en aplicaciones de Android, y pude encontrar algunas muestras en sus aplicaciones de muestra oficiales. Pero realmente no podía entender el uso de algunos de ellos. Por ejemplo, ThreadSample y DisplayingBitmaps aplicaciones utilizanWeakReference
en su código, pero después de correr varias pruebas, he encontrado que el método get () no vuelve nuncanull
, porque la vista referenciada objeto se recicla en los adaptadores, en lugar de basura recogida.fuente
Algunas de las otras respuestas parecen incompletas o demasiado largas. Aquí hay una respuesta general.
Cómo usar WeakReference en Java y Android
Puedes hacer los siguientes pasos:
WeakReference
variableCódigo
MyClass
tiene una referencia débil aAnotherClass
.AnotherClass
tiene una fuerte referencia aMyClass
.Notas
MyClass
era A yAnotherClass
fue B.WeakReference
es hacer que otra clase implemente una interfaz. Esto se hace en el patrón de escucha / observador .Ejemplo práctico
fuente
// allow MyClass to get a weak reference to this class void someMethod() { mMyClass = new MyClass(); mMyClass.someMethod(this); }
??weakreference
objeto en sí mismo en ladoSomething
función para que no esténull
antes de llamar a laget
función.Un mapeo "canonicalizado" es donde mantiene una instancia del objeto en cuestión en la memoria y todas las demás buscan esa instancia en particular a través de punteros o algún mecanismo. Aquí es donde las referencias de los débiles pueden ayudar. La respuesta corta es que los objetos WeakReference se pueden usar para crear punteros a objetos en su sistema y al mismo tiempo permitir que esos objetos sean reclamados por el recolector de basura una vez que pasan del alcance. Por ejemplo, si tuviera un código como este:
Cualquier objeto que registre nunca será reclamado por el GC porque hay una referencia a él almacenado en el conjunto de
registeredObjects
. Por otro lado si hago esto:Luego, cuando el GC quiera reclamar los objetos en el Conjunto, podrá hacerlo. Puede utilizar esta técnica para el almacenamiento en caché, la catalogación, etc. Consulte a continuación las referencias a debates mucho más detallados sobre GC y almacenamiento en caché.
Ref: recolector de basura y referencia débil
fuente