Realizar un seguimiento de la clase de padre de miembro imageview
Tengo clase A con una variable de instancia ImageView. Actualmente utilizo setTag () para obtener de ImageView de nuevo a la instancia de la clase A. ¿Podría presentar el bucle circular? También oí hablar de referencias débiles. ¿Cuál es la mejor manera de llegar a la clase padre A de ImageView?
Mi escenario de uso es que estoy arrastrando el ImageView alrededor de la pantalla y necesito acceder a la clase A para obtener información sobre el ImageView que se está arrastrando.
- ArrayList Encontrar el primer y el último elemento
- ¿Es String una primitiva o un Objeto en Android o Java?
- Analizar XML desde un sitio web a un dispositivo Android
- Buenas Prácticas: Validación de Entradas (Android)
- Ejecutar archivo java en qt
- Denotan progreso por el borde de Android
- ¿Cómo puedo optimizar este código que contiene alguna línea repetitiva?
- ¿Ha utilizado alguien la biblioteca IAX24 J para las llamadas entrantes?
- Vista de imagen que no envuelve contenido
- ¿Cómo continuar un bucle for después de un tiempo determinado sin usar el método `try ... catch`?
- ¿Tengo que usar CollectionResponse como un tipo de retorno en GAE Endpoints API o puedo usar colecciones java de entidades?
- Busquen una letra abreviatura de week day of a date en java
- Java.util.concurrent.TimeoutException android.view.ThreadedRenderer.finalize () tiempo de espera transcurridos 10 segundos
Creo que Dalvik VM no tiene problema con la detección de referencias circulares.
Aquí está Q / A que discute esto: Referencias circulares en Java
Sólo una implementación muy ingenua tendría un problema con las referencias circulares.
Utilizaría setTag para mantener ref a un objeto relacionado. Además, usar setTag / getTag en View es un enfoque estándar y recomendado para lograr varias optimizaciones en Android, incluso en las muestras de Android. Algunas referencias:
http://www.vogella.de/articles/AndroidListView/article.html#ownadapter_viewHolder
Vista de lista personalizada de Android
Si el GC de Android tuviera problemas para detectar tales dependencias, Android no funcionaría ya que funciona. Siga adelante y use View.setTag si se adapta a su propósito.
Las referencias circulares en java no son un problema para el GC. Esto no es un problema debido a un concepto llamado "accesibilidad".
Puede pensar en referencias de objetos como un grafo dirigido, donde los nodos son objetos y los bordes son referencias de objetos. Hay un conjunto de nodos en el gráfico llamado "nodos raíz" – estos son (aproximadamente) los objetos que son directamente accesibles a algún hilo en el vm. Cosas como variables locales en cualquier llamada de función en la pila, campos estáticos en las clases, etc.
Al realizar una recolección de basura, la VM comienza con estos nodos raíz y los marca como "en uso". Luego, para cada borde que lleva fuera de estos nodos en uso, (es decir, para cada objeto que se hace referencia desde los objetos en uso), también marca como en uso, y así sucesivamente, hasta que no queda nada para marca. Y luego, cualquier objeto que no estuviera marcado como "en uso", sabe que puede recolectar con seguridad basura.
Ahora, digamos, por ejemplo, estás en algún método, y tienes el siguiente código:
a = new A(); ab = b; b = new B(); ba = a
Ahora tiene una referencia circular entre a y b. Y ambos objetos forman parte del conjunto raíz, ya que son una variable local en una llamada al método que está en la pila.
A continuación, al salir de ese método, tanto a como b ya no formarán parte del conjunto raíz. Y mientras no hagas una referencia a ellos en otro lugar, no hay nada más que tenga una referencia a cualquiera a o b.
Así que ahora, el gráfico de referencia del objeto tendrá una parte poco desconectada de la gráfica que contiene ayb. Ambos todavía tienen referencias entre sí, pero nada más tiene una referencia a ellos. Dado que no son accesibles desde el conjunto de raíces, el GC sabe que no se están utilizando y puede recolectar basura – a pesar de que tienen referencias entre sí.
(Tenga en cuenta que esta es una descripción algo simplificada de la recolección de basura, pero sigue siendo un modelo útil / razonable mental de cómo funciona)
Así que la respuesta corta es: "Sí, usted tiene una referencia circular, pero esto no es un problema, porque ambos objetos serán recogidos una vez que ambos ya no son alcanzables"
La mejor manera de deshacerse de las referencias circulares es hacer que la variable de instancia en A sea una variable final:
private final ImageView myImageView;
Esto le obligará a inicializar la variable en el constructor de A. Si pasa explícitamente la referencia a ImageView
en las nuevas llamadas, evitará las posibilidades de referencias circulares.
public A(ImageView iv, ...) { this.myImageView = iv; ... // associate this instance of A with ImageView? this.imageView.setTag(this); ... }
- ¿Por qué obtengo un error de acceso ilegal al ejecutar las pruebas de Android?
- Uso incorrecto de BufferedReader