两个Activity之间的观察者模式

来源:互联网 发布:淘宝玻璃茶具销量前十 编辑:程序博客网 时间:2024/05/20 16:09

需求是在闪屏页面启动定位功能,在MainActivity中更改位置信息。如果定位功能在MainActivity生成之前完成。则在MainActivity初始化时就有位置信息。若由于网络原因等在MainActivity生成之后才完成定位,这时候需要通知MainActivity改变定位信息。就涉及到了观察者模式。

最初我的想法是将闪屏页面设为具体通知者,将MainActivity设为具体观察者。结果在给通知者添加观察者的时候发现了问题。因为在闪屏页面中MainActivity还没有被创建。也就没有MainActivity对象。这就没法给观察者设置监听了。

解决方法是将设置监听的过程放到MainActivity中,而通知者设置为一个单例的类。而观察者依然是MainActivity。这样如果定位在MainActivity创建之前执行完成,则不需要绑定监听。如果在MainActivity创建之后执行完成,则MainActivity把自身设置为观察者。在定位结束之后就会由通知者发送通知给观察者。

具体代码:

MainActivity中绑定监听


private IGetCityNameListener getCityNameListener;
if (CITY_NAME != null) {
textViewLocation.setText(CITY_NAME);
} else {
getCityNameListener = EventListener.getEventListener();
getCityNameListener.addWeacher(this);
}

通知者类:

public class EventListener implements IGetCityNameListener {
private ICityNameWacher cityNameWacher;
private static EventListener eventListener;


private EventListener() {
}


// 单例模式使两个Activity使用同一个通知者类对象。
public static EventListener getEventListener() {
if (eventListener == null) {
synchronized (EventListener.class) {
if (eventListener == null) {
EventListener temp = new EventListener();
eventListener = temp;
}
}
}
return eventListener;
}


@Override
public void addWeacher(ICityNameWacher cityNameWacher) {
this.cityNameWacher = cityNameWacher;
}


@Override
public void removeWeacher(ICityNameWacher cityNameWacher) {
// TODO Auto-generated method stub


}


@Override
public void sendChange() {
// 如果观察者为空则说明在MainActivity创建之前定位服务已经完成,不需要发送更改的通知。
if (cityNameWacher != null) {
cityNameWacher.updateCityName();
}
}


}

0 0
原创粉丝点击