【问题标题】:WeakHashMap not working as expected in observer patternWeakHashMap 在观察者模式中没有按预期工作
【发布时间】:2016-07-03 09:10:34
【问题描述】:

我正在尝试使用 Wea​​kHashMap 在 Android 中实现观察者模式。这里是代码。

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;
   }
}

问题是然后设备旋转我希望weakhashmap观察者没有自动删除,并且在创建视图方法中添加了新的观察者。 因此,在第一次旋转之后观察者包含 2 个元素,在下一次旋转之后 - 3 等等,虽然我认为它只会是 1。有什么问题?

【问题讨论】:

    标签: android android-fragments weakhashmap


    【解决方案1】:

    嗬,我找到答案了。更改方向将片段的所有属性设置为空,但不必将其从堆中删除,直到它执行垃圾收集器。这就是为什么它没有从 WeakHashMap 中删除。所以为了做到这一点,需要在 onPause 方法上运行 System.gc()。希望它可以帮助某人:)

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      相关资源
      最近更新 更多