2016-07-03 13 views
0

WeakHashMapでAndroidにオブザーバパターンを実装しようとしています。ここでコード。WeakHashMapがオブザーバパターンで期待どおりに動作しない

public class DataObservable { 
    static WeakHashMap<DataObserver, Class> observers = new WeakHashMap<>(); 

    public static void addObserver(DataObserver observer, Class dataclass) { 
     observers.put(observer, dataclass); 
    } 

    public static void notifyDataChanged(Class dataclass, Result result) { 
     for (Map.Entry<DataObserver, Class> entry : observers.entrySet()) { 
      DataObserver observer = entry.getKey(); 
      Class observerDataClass = entry.getValue(); 
      if (observerDataClass == dataclass) { 
       observer.updateData(dataclass, result); 
      } 
     } 
    } 
} 


public interface DataObserver { 
    void updateData(Class dataclass, Result result); 
} 

public MyFragment extends Fragment{ 
    private DataObserver couponsObserver = new DataObserver() { 
     @Override 
     public void updateData(Class dataclass, Result result) { 
      Log.d("d", "sdg"); 
     } 
    } ; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_sales_coupons, container, false); 
     DataObservable.addObserver(couponsObserver, SalesCoupon.class); 
     return view; 
    } 
} 

問題は、デバイスiはviewメソッドは新しいオブザーバーを追加作成のWeakHashMapオブザーバーは自動的に削除され、中にdidntのことを期待して回転させることです。 したがって、最初の回転オブザーバーには2つの要素が含まれ、次の回転後には3などとなりますが、それは1になると思います。何が問題なのですか?

答えて

0

ホー、私は答えを見つける。方向を変更すると、フラグメントのすべてのプロパティがnullに設定されますが、ガベージコレクタが実行されるまで、ヒープからそのフラグメントを削除する必要はありません。これがWeakHashMapから削除されなかった理由です。ですから、これを行うにはonPauseメソッドでSystem.gc()を実行する必要があります。希望は誰かを助ける:)

関連する問題