0

次の 2 つのクラスがあるとします。

public class Network {
   private static Network instance;
   public Network() {
      instance = this;
   }
   public static Network getInstance() {
      return instance;
   } 
   public interface Listener {
       public void event(String msg);
   };
   ArrayList<Listener> listeners = new ArrayList<Listener>();

   public void addListener(Listener listener) {
        listeners.add(listener);
   }


}


public class Act1 extends Activity implements Network.Listener {
    @Override
    public void onCreate(Bundle b) {
        Network.getInstance().addListener(this);
    }
    public void event(String msg) {
       // do nothing
    }
}

public class Act2 extends Activity implements Network.Listener {
    @Override
    public void onCreate(Bundle b) {
          Network.getInstance().addListener(new Network.Listener() {
     public void event(String msg) {
      // do nothing
        }
    );
    }
    public void event(String msg) {
    }
}

ユーザーが別のアクティビティに移動すると、いずれかのアクティビティがリークしますか? いずれかのアクティビティが GCed を取得できなくなりますか? 上記のリスナーの実装に問題はありますか?

4

1 に答える 1

1

あなたの例にはいくつかの間違いがあります。

たとえば、ネットワークをインスタンス化することはなく、インスタンス化するたびに、静的フィールドは別のインスタンスを参照します。ネットワークを記述するより適切な方法は次のとおりです。

public class Network {
    private static final Network INSTANCE = new Network();

    private Network() {/*empty*/}

    public static Network get() {
        return INSTANCE;
    }

    //rest of the code ommitted
}

ただし、Activity インスタンスを Network シングルトン (Network クラスの静的フィールド インスタンス - ある時点で初期化すると仮定) から削除していない場合、そのインスタンスには、追加された Activity オブジェクトへの参照が常に含まれます。配列リスト。この方法では、ガベージ コレクションを実行できません。

于 2013-07-09T18:44:22.120 に答える