2.4.1 View部分
-
GlobalView
chatroom.view.xml:
<bean name="ViewChatRoomInfo"> <variable name="name" type="string" /> <variable name="roomid" type="long" /> </bean> <bean name="RoomChatHallInfo"> <variable name="name" type="string" /> <variable name="hallid" type="long" /> <variable name="rooms" type="vector" value="ViewChatRoomInfo" /> </bean> <view name="CommonInfo" lifecycle="global"> <variable name="halls" type="vector" value="RoomChatHallInfo" /> </view>
这个GlobalView仅有1个字段halls,为RoomChatHallInfo的数组,提供了完整的聊天大厅和大厅内房间的信息。
SessionManager.java:
static void setViewHallsFromCache() { final ArrayList<RoomChatHallInfo> halls = new ArrayList<>(); .................... CommonInfo.getInstance().setHalls(halls); lastSetHallsTimeStamp = System.currentTimeMillis(); }
setViewHallsFromCache根据数据库配置信息构建halls数组, 设置到CommonInfo中, 这个方法在运行时调整了hall配置以后调用。该方法在系统初始化, 或者修改了大厅或房间配置以后调用。
UserInfo.java:
void checkUpdateHallInfos() { if (updateroominfotime < SessionManager.lastSetHallsTimeStamp) { updateroominfotime = System.currentTimeMillis(); CommonInfo.getInstance().syncToClient(getSessionId()); } }
这个方法为当前用户检测客户端获得的hall信息是否最新版本,如果不是则将最新版本更新到客户端。
搜索checkUpdateHallInfos的引用,可以发现,有3处调用。
UserInfo.java:
private UserInfo(SessionView.CreateParameter param) { .............. checkUpdateHallInfos(); }
用户登录成功,创建SessionView时调用,初始化客户端hall信息,这个必然需要。
UserInfo.java:
protected void onMessage(String message, long sessionid) { final int index = message.indexOf('='); if (-1 == index) return; checkUpdateHallInfos(); ................... }
收到用户Message时,用户命令频率相对很低,检测一次无关紧要。
ChatRoom.java:
protected void onDetached(long sessionid, byte reason) { RoomInfo.increment_memberCount_mapkey(roomid, -1L); UserInfo info = UserInfo.getInstance(sessionid); if (info != null) info.checkUpdateHallInfos(); }
用户离开聊天室,重新进入大厅,这个时候如果hall信息有改变,刷新一次理所当然。
这里可以看出,GlobalView主要是为那些全局配置信息提供支持,这样的信息不需要改变以后立刻刷新,可以根据需求在特定的点手动刷新。