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.

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); ... } 
  • Ant depuración y liberación de hormigas falló
  • ¿Deshacer / rehacer rápidamente con el patrón del memento / comando?
  • ¿Cómo escuchar cualquier teclado en toda la aplicación?
  • Buscar una subcadena entre ciertos caracteres en un índice desconocido
  • Android escribir en disco no fiable - escrito file.length! = Expected.length
  • ¿Por qué Google eligió Java para el sistema operativo Android?
  • Detección de estilo de conducción mediante sensores de Smartphone
  • ¿Enviar una difusión ordenada localmente (dentro de mi proceso)?
  • El texto personalizado de TextView no muestra texto pero sólo muestra el fondo
  • ¿Dónde puedo encontrar una biblioteca JAVA de efectos visuales y manipulación de imágenes?
  • Detectar el gesto de fling sobre los elementos que se pueden hacer clic
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.