有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用弱引用侦听器的java

假设如下:

public interface Listener {
   public void onListen();
}

public class ActionClass {

   WeakReference<Listener> listener = null;

   public void doAction(String action, Listener listener) {
      this.listener = new WeakReference<Listener>(listener);
      doTheAction(action);
   }

   public void actionComplete() {
     if (listener != null && listener.get() != null)
          listener.onListen();

   } 
}

public class AnotherClass {
   ActionClass actioner = new ActionClass();
   void init()  {
      actioner.doAction("something", new Listener() {
          onListened() {
              Log.d("Tag", "Action complete!");
          }
      };


   }
}

抱歉,如果有拼写错误/语法错误,这更应该是伪代码

无论如何,很多时候,当“Action”完成时,对listener的WeakReference将被GCed,即使“AnotherClass”的实例仍然存在。有没有办法避免这种情况


共 (1) 个答案

  1. # 1 楼答案

    顺便说一句,你的代码中有一个bug,而不是一个答案:

    if (listener != null && listener.get() != null)
        listener.get().onListen();
    

    这段代码包含一个竞争条件,因为GC可以在您检查它的null时间和您调用它的时间之间获取引用。您需要将其替换为以下内容:

    if(listener != null) {
        Listener l = listener.get():
        if(l != null)
            l.onListen();
    }
    

    这通过在局部变量中有一个引用来保持任何侦听器的活动

    此外,您应该知道,GC可能会比您的AnotherClass存活的时间长得多,因为无法保证它何时会收获,但我想您知道这一点