WeakHashMap 在观察者模式中没有按预期工作
WeakHashMap not working as expected in observer pattern
我正在尝试使用 WeakHashMap 在 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。有什么问题吗?
呵呵,我找到答案了。更改方向将片段的所有属性设置为 null,但没有必要将其从堆中删除,直到它执行垃圾收集器。这就是它没有从 WeakHashMap 中删除的原因。所以为了做到这一点,需要在 onPause 方法上使用 运行 System.gc() 。希望它对某人有所帮助:)
我正在尝试使用 WeakHashMap 在 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。有什么问题吗?
呵呵,我找到答案了。更改方向将片段的所有属性设置为 null,但没有必要将其从堆中删除,直到它执行垃圾收集器。这就是它没有从 WeakHashMap 中删除的原因。所以为了做到这一点,需要在 onPause 方法上使用 运行 System.gc() 。希望它对某人有所帮助:)