Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从成员imageview跟踪父类_Java_Android - Fatal编程技术网

Java 从成员imageview跟踪父类

Java 从成员imageview跟踪父类,java,android,Java,Android,我有一个带有实例变量ImageView的类。目前,我使用setTag()从ImageView返回类A的实例。这会出现循环吗?我还听说有人提到弱引用。获取ImageView父类A的最佳方式是什么 我的使用场景是在屏幕上拖动ImageView,我需要访问class A以获取有关所拖动ImageView的信息。摆脱循环引用的最佳方法是将实例变量设置为最终变量: private final ImageView myImageView; 这将迫使您在A的构造函数中初始化变量。如果在新调用中显式地传递

我有一个带有实例变量ImageView的类。目前,我使用setTag()从ImageView返回类A的实例。这会出现循环吗?我还听说有人提到弱引用。获取ImageView父类A的最佳方式是什么


我的使用场景是在屏幕上拖动ImageView,我需要访问class A以获取有关所拖动ImageView的信息。

摆脱循环引用的最佳方法是将实例变量设置为最终变量:

  private final ImageView myImageView;
这将迫使您在A的构造函数中初始化变量。如果在新调用中显式地传递对
ImageView
的引用,将避免循环引用的机会

  public A(ImageView iv, ...) {
    this.myImageView = iv;
    ...
    // associate this instance of A with ImageView?
    this.imageView.setTag(this);
    ...
  }

我相信Dalvik VM在检测循环引用方面没有问题

  public A(ImageView iv, ...) {
    this.myImageView = iv;
    ...
    // associate this instance of A with ImageView?
    this.imageView.setTag(this);
    ...
  }
以下是讨论这个问题的问答:

只有非常幼稚的实现才会有循环问题 参考资料

  public A(ImageView iv, ...) {
    this.myImageView = iv;
    ...
    // associate this instance of A with ImageView?
    this.imageView.setTag(this);
    ...
  }
我会使用setTag来保存相关对象的ref。此外,在视图上使用setTag/getTag是在Android上实现各种优化的标准和推荐方法,甚至可以在Android示例中找到。 一些参考资料:

如果Android的GC在检测这些依赖项时遇到问题,Android将无法正常工作。
如果符合您的目的,请继续使用View.setTag。

java中的循环引用对GC来说不是问题。这不是一个问题,因为有一个叫做“可达性”的概念

可以将对象引用视为有向图,其中节点是对象,边是对象引用。图中有一组称为“根节点”的节点,这些节点(大致上)是vm中某个线程可以直接访问的对象。比如堆栈上任何函数调用中的局部变量,类中的静态字段等等

当执行垃圾收集时,VM从这些根节点开始,并将它们标记为“正在使用”。然后,对于从这些在用节点引出的每条边(即,对于从在用对象引用的每个对象),它也会标记为在用,以此类推,直到没有任何东西可标记为止。然后,任何未标记为“正在使用”的对象,它都知道它可以安全地进行垃圾收集

现在,让我们假设您在某个方法中,您有以下代码:

a = new A();
a.b = b;

b = new B();
b.a = a
现在在a和b之间有一个循环引用。这两个对象都是根集的一部分,因为它们是堆栈上方法调用中的局部变量

然后,当您退出该方法时,a和b将不再是根集的一部分。只要你没有在别的地方提到它们,就没有别的东西可以提到a或b

现在,你的对象引用图将有一个小的断开的部分,包含a和b。他们两个仍然相互引用,但没有其他任何东西引用他们。由于无法从根集访问它们,因此GC知道它们没有被使用,并且可以对它们进行垃圾收集,即使它们彼此有引用

(请注意,这是对垃圾收集的一个简化描述,但它仍然是一个有用/合理的工作原理模型)


因此,简短的回答是:“是的,您有一个循环引用。但这不是问题,因为一旦两个对象都不再可访问,就会收集这两个对象”

jusr为什么不使用您自己的哈希集来跟踪您的引用(ImageView的ID->ClassA实例)?我正在网上寻找确认settag是一个弱引用。但似乎找不到它?研究查看的源代码:受保护对象mTag;public void setTag(final Object tag){mTag=tag;}setTag与weakreference无关。但是,如果您正试图实现这一目标,则可以在标记中添加WeakReference。话虽如此,请确保你明白一个弱引用首先会让你明白什么。